中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

建站神器淄博搜索引擎優(yōu)化

建站神器,淄博搜索引擎優(yōu)化,目前h5頁面的制作工具有哪些,星樂seo網(wǎng)站關(guān)鍵詞排名優(yōu)化1、FSM簡介 1.1 有限狀態(tài)機的定義 有限狀態(tài)機(Finite State Machine,FSM)是一種數(shù)學模型,用于描述系統(tǒng)在不同狀態(tài)下的行為和轉(zhuǎn)移條件。 狀態(tài)機有三個組成部分:狀態(tài)(State)、事件(…

1、FSM簡介

1.1 有限狀態(tài)機的定義

有限狀態(tài)機(Finite State Machine,FSM)是一種數(shù)學模型,用于描述系統(tǒng)在不同狀態(tài)下的行為和轉(zhuǎn)移條件。

狀態(tài)機有三個組成部分:狀態(tài)(State)、事件(Event)、動作(Action),事件(轉(zhuǎn)移條件)觸發(fā)狀態(tài)的轉(zhuǎn)移和動作的執(zhí)行。動作的執(zhí)行不是必須的,可以只轉(zhuǎn)移狀態(tài),不指定任何動作。總體而言,狀態(tài)機是一種用以表示有限個狀態(tài)以及這些狀態(tài)之間的轉(zhuǎn)移和動作的執(zhí)行等行為的數(shù)學模型。

狀態(tài)機可以用公式?State(S) , Event(E) -> Actions (A), State(S’)表示,即在處于狀態(tài)S的情況下,接收到了事件E,使得狀態(tài)轉(zhuǎn)移到了S’,同時伴隨著動作A的執(zhí)行。

Event(事件)是指觸發(fā)狀態(tài)轉(zhuǎn)換的輸入信號或條件。它可以是任何類型的輸入,例如傳感器數(shù)據(jù)、用戶輸入、網(wǎng)絡(luò)消息等。在編程中,Event通常是一個枚舉類型,每個枚舉值代表一個特定的事件。

State(狀態(tài))是指系統(tǒng)在某一時刻所處的狀態(tài),它是系統(tǒng)的一種抽象描述。在有限狀態(tài)機中,狀態(tài)是由一組狀態(tài)變量來描述的,這些狀態(tài)變量的取值決定了系統(tǒng)的狀態(tài)。狀態(tài)可以是離散的,也可以是連續(xù)的。在有限狀態(tài)機中,狀態(tài)通常用一個圓圈來表示,圓圈內(nèi)部寫上狀態(tài)的名稱。例如,一個簡單的有限狀態(tài)機可以有兩個狀態(tài):開和關(guān),它們可以用以下方式表示:

Action(動作)是指在狀態(tài)轉(zhuǎn)移時執(zhí)行的操作或動作。當有限狀態(tài)機從一個狀態(tài)轉(zhuǎn)移到另一個狀態(tài)時,可以執(zhí)行一個或多個action來改變系統(tǒng)的狀態(tài)或執(zhí)行某些操作。例如,當有限狀態(tài)機從“待機”狀態(tài)轉(zhuǎn)移到“運行”狀態(tài)時,可以執(zhí)行一個action來啟動系統(tǒng)。在實際應(yīng)用中,action可以是任何有效的代碼,例如函數(shù)調(diào)用、變量賦值、打印輸出等。

FSM 通常用于編程中,用于實現(xiàn)狀態(tài)轉(zhuǎn)移和控制流程。

注意:

在任何時刻,FSM 只能處于一種狀態(tài)。

1.2 Go中的FSM

通過上面關(guān)于有限狀態(tài)機的定義,我們大概知道了狀態(tài)機是個什么東西,那么Golang中是怎么實現(xiàn)的呢。不用慌,已經(jīng)有大佬實現(xiàn)好了,只管用就好了。

安裝:

go get github.com/looplab/fsm@v1.0.1

接下來一起看看github.com/looplab/fsm?是如何使用的。

2、github.com/looplab/fsm 如何使用

注意:

不同版本的 fsm 使用方式,可能不太一樣,最好是看下?NewFSM?函數(shù)的注釋,看下具體的細節(jié)。 本篇文章以:github.com/looplab/fsm@v1.0.1?為例。

2.1 fsm 基礎(chǔ)使用

這里把官方的例子改了下,感覺官方的例子不是很清晰。代碼如下:

package mainimport ("context""fmt""github.com/looplab/fsm"
)type Door struct {Name  stringFSM *fsm.FSM
}func NewDoor(name string) *Door {d := &Door{Name: name,}d.FSM = fsm.NewFSM("closed",fsm.Events{{Name: "open", Src: []string{"closed"}, Dst: "open"},{Name: "close", Src: []string{"open"}, Dst: "closed"},},fsm.Callbacks{"enter_state": func(_ context.Context, e *fsm.Event) { d.enterState(e) },},)return d
}func (d *Door) enterState(e *fsm.Event) {fmt.Printf("The door's name:%s , current state:%s\n", d.Name, e.Dst)
}func main() {door := NewDoor("測試")fmt.Printf("fsm current state: %s \n", door.FSM.Current())err := door.FSM.Event(context.Background(), "open")if err != nil {fmt.Println(err)}fmt.Printf("fsm current state: %s \n", door.FSM.Current())err = door.FSM.Event(context.Background(), "close")if err != nil {fmt.Println(err)}fmt.Printf("fsm current state: %s \n", door.FSM.Current())
}

執(zhí)行結(jié)果:

fsm current state: closed 
The door's name:測試 , current state:open
fsm current state: open 
The door's name:測試 , current state:closed
fsm current state: closed

這里就通過Event改變FSM中的狀態(tài)。轉(zhuǎn)移公式為:Src,Event -> Dst,d.enterState。大意就是接受到了輸入Event,狀態(tài)機的StateSrc->Dst,并且執(zhí)行了Action:d.enterState。

2.2 fsm 中 Action 何時執(zhí)行?

剛開始使用的時候,好奇d.enterState(e)是什么時候調(diào)用的,我們一起看看?NewFSM?中的注釋就清楚了。

// NewFSM constructs a FSM from events and callbacks.
//
// The events and transitions are specified as a slice of Event structs
// specified as Events. Each Event is mapped to one or more internal
// transitions from Event.Src to Event.Dst.
// Callbacks are added as a map specified as Callbacks where the key is parsed
// as the callback event as follows, and called in the same order:
//
// 1. before_<EVENT> - called before event named <EVENT>
//
// 2. before_event - called before all events
//
// 3. leave_<OLD_STATE> - called before leaving <OLD_STATE>
//
// 4. leave_state - called before leaving all states
//
// 5. enter_<NEW_STATE> - called after entering <NEW_STATE>
//
// 6. enter_state - called after entering all states
//
// 7. after_<EVENT> - called after event named <EVENT>
//
// 8. after_event - called after all events
//
// There are also two short form versions for the most commonly used callbacks.
// They are simply the name of the event or state:
//
// 1. <NEW_STATE> - called after entering <NEW_STATE>
//
// 2. <EVENT> - called after event named <EVENT>
//
// If both a shorthand version and a full version is specified it is undefined
// which version of the callback will end up in the internal map. This is due
// to the pseudo random nature of Go maps. No checking for multiple keys is
// currently performed.

從上面我們知道了,d.enterState(e)?是在called after entering all states?時執(zhí)行的。

2.2.1 完整版書寫的Callbacks執(zhí)行順序

從上面的注釋能知道完整版書寫的Callbacks的執(zhí)行順序如下:

2.2.2 簡寫版的Callbacks執(zhí)行順序

2.2.3 注意事項

雖然Callbacks的寫法有兩種,但是不能同時使用完整版和簡寫版,否則最終使用那個版本是不確定的。

2.3 較為完整的例子

package mainimport ("context""fmt""github.com/looplab/fsm"
)type Door struct {Name  stringFSM *fsm.FSM
}func NewDoor(name string) *Door {d := &Door{Name: name,}d.FSM = fsm.NewFSM("closed",fsm.Events{{Name: "open", Src: []string{"closed"}, Dst: "open"},{Name: "close", Src: []string{"open"}, Dst: "closed"},},fsm.Callbacks{"before_open": func(_ context.Context, e *fsm.Event) { d.beforeOpen(e) },"before_event": func(_ context.Context, e *fsm.Event) { d.beforeEvent(e) },"leave_closed": func(_ context.Context, e *fsm.Event) { d.leaveClosed(e) },"leave_state": func(_ context.Context, e *fsm.Event) { d.leaveState(e) },"enter_open": func(_ context.Context, e *fsm.Event) { d.enterOpen(e) },"enter_state": func(_ context.Context, e *fsm.Event) { d.enterState(e) },"after_open": func(_ context.Context, e *fsm.Event) { d.afterOpen(e) },"after_event": func(_ context.Context, e *fsm.Event) { d.afterEvent(e) },},)return d
}func (d *Door) beforeOpen(e *fsm.Event) {fmt.Printf("beforeOpen, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}func (d *Door) beforeEvent(e *fsm.Event) {fmt.Printf("beforeEvent, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}func (d *Door) leaveClosed(e *fsm.Event) {fmt.Printf("leaveClosed, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}func (d *Door) leaveState(e *fsm.Event) {fmt.Printf("leaveState, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}func (d *Door) enterOpen(e *fsm.Event) {fmt.Printf("enterOpen, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}func (d *Door) enterState(e *fsm.Event) {fmt.Printf("enterState, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}func (d *Door) afterOpen(e *fsm.Event) {fmt.Printf("afterOpen, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}func (d *Door) afterEvent(e *fsm.Event) {fmt.Printf("afterEvent, current state:%s, Dst:%s \n", d.FSM.Current(), e.Dst)
}func main() {door := NewDoor("測試")fmt.Printf("fsm current state: %s \n", door.FSM.Current())err := door.FSM.Event(context.Background(), "open")if err != nil {fmt.Println(err)}fmt.Printf("fsm current state: %s \n", door.FSM.Current())err = door.FSM.Event(context.Background(), "close")if err != nil {fmt.Println(err)}fmt.Printf("fsm current state: %s \n", door.FSM.Current())
}

執(zhí)行結(jié)果:大家重點看current state何時發(fā)生的變化。?

fsm current state: closed 
beforeOpen, current state:closed, Dst:open 
beforeEvent, current state:closed, Dst:open 
leaveClosed, current state:closed, Dst:open 
leaveState, current state:closed, Dst:open 
enterOpen, current state:open, Dst:open 
enterState, current state:open, Dst:open 
afterOpen, current state:open, Dst:open 
afterEvent, current state:open, Dst:open 
fsm current state: open 
beforeEvent, current state:open, Dst:closed 
leaveState, current state:open, Dst:closed 
enterState, current state:closed, Dst:closed 
afterEvent, current state:closed, Dst:closed 
fsm current state: closed 

?

http://www.risenshineclean.com/news/64990.html

相關(guān)文章:

  • 移動網(wǎng)站開發(fā)實訓(xùn)報告泉州百度seo公司
  • 莆田網(wǎng)站建設(shè)五維網(wǎng)絡(luò)有限公司百度ai助手入口
  • 網(wǎng)站后臺開發(fā) 必備技能關(guān)鍵詞林俊杰百度云
  • 彈幕網(wǎng)站制作市場營銷策劃書
  • wordpress tag導(dǎo)入2022年seo最新優(yōu)化策略
  • vb2010做網(wǎng)站企業(yè)營銷網(wǎng)站建設(shè)系統(tǒng)
  • html網(wǎng)站開發(fā)工具下載北京網(wǎng)站優(yōu)化托管
  • 東莞專業(yè)網(wǎng)站建設(shè)公司站長工具ping
  • 河南做網(wǎng)站公司排名全國十大跨境電商公司排名
  • 在環(huán)評備案網(wǎng)站上做登記后會怎么樣6淘寶直通車
  • 做跨境的網(wǎng)站有哪些網(wǎng)絡(luò)口碑營銷案例
  • 如何做國外的網(wǎng)站網(wǎng)絡(luò)營銷八大工具
  • 直播營銷惠州seo推廣優(yōu)化
  • 哪些網(wǎng)站做財金的好seo網(wǎng)絡(luò)營銷技巧
  • 相城做網(wǎng)站的公司東營網(wǎng)站建設(shè)費用
  • 如何修改網(wǎng)站后臺seo推廣效果
  • 免費空間申請網(wǎng)站google關(guān)鍵詞搜索技巧
  • 大連建站企業(yè)域名注冊需要什么條件
  • 做外貿(mào)的數(shù)據(jù)網(wǎng)站鏈接檢測工具
  • 學校網(wǎng)站織夢源碼騰訊中國聯(lián)通
  • 315網(wǎng)站專題怎么做google推廣費用
  • 平面設(shè)計師長逛的網(wǎng)站有哪些網(wǎng)站的網(wǎng)絡(luò)推廣
  • 世界網(wǎng)站制作百度app怎么找人工客服
  • 網(wǎng)站開發(fā)付費視頻才能觀看小程序開發(fā)公司排行榜
  • 網(wǎng)站首頁的尺寸2022網(wǎng)站seo
  • 網(wǎng)站開發(fā)職業(yè)規(guī)劃實施網(wǎng)站模板之家
  • 做營銷網(wǎng)站設(shè)計百度免費咨詢
  • 河北住房和城鄉(xiāng)建設(shè)局網(wǎng)站首頁百度免費推廣
  • 東莞推廣網(wǎng)站排名seo研究中心官網(wǎng)
  • 教育行業(yè)網(wǎng)站建設(shè)代做seo關(guān)鍵詞排名