首頁 >後端開發 >Golang >golang:如何定義步驟序列

golang:如何定義步驟序列

PHPz
PHPz轉載
2024-02-10 14:27:09967瀏覽

golang:如何定義步驟序列

php小編香蕉為您介紹如何在Golang中定義步驟序列。在軟體開發中,經常需要按照一定的順序執行一系列的操作或任務。 Golang提供了一種簡潔而有效的方式來定義和執行步驟序列。透過使用goroutine和channel,我們可以實現並發執行多個步驟,並確保它們按照指定的順序執行。在本文中,我們將探討如何定義步驟序列,並使用實例程式碼來示範其用法。無論您是Golang初學者還是有經驗的開發者,本文都將為您提供有價值的資訊和實用的技巧。讓我們一起來看看吧!

問題內容

我想寫一個協定測試。我目前的想法是定義一系列步驟。每個步驟都包含 triggerexpectation - 例如觸發 msga 並期望 msgb

type series struct {
  steps []step
}

我不喜歡這個的是series 不明確:我必須按順序創建切片,然後希望它永遠不會混亂,並依賴它,或者sort 它然後有實現排序函數,這是完全不必要的。

正式定義 series 並以此方式使其明確的好的設計是什麼?

我現在最好的想法是創建一個帶有 int 索引的地圖:

type Series struct {
   Steps map[int]Step
}

series := Series{
   Steps: map[int]Step{
     0: Step{},
     1: Step{},
     2: Step{},
     ...
   }
}

另一種選擇可能是為自己建立一個連結清單。 go 沒有實現(據我所知)。必須為此自己構建一個感覺很奇怪。但這樣的解決方案也會稍微失去明確功能:基本上,您總是必須瀏覽連結清單才能取得整個序列(例如「第 4 步是什麼」)。

解決方法

除了使用地圖,您仍然可以使用切片並使用鍵控 複合文字

var steps = []step{
    0: step{},
    1: step{},
    ...
}

規格:複合文字中有詳細說明:

compositelit  = literaltype literalvalue .
literaltype   = structtype | arraytype | "[" "..." "]" elementtype |
                slicetype | maptype | typename [ typeargs ] .
literalvalue  = "{" [ elementlist [ "," ] ] "}" .
elementlist   = keyedelement { "," keyedelement } .
keyedelement  = [ key ":" ] element .
key           = fieldname | expression | literalvalue .
fieldname     = identifier .
element       = expression | literalvalue .

如您所見,keyedelement 可能包含可選的 key ":" 部分。

...該鍵被解釋為結構體文字的欄位名稱、陣列和切片文字的索引以及映射文字的鍵。

請注意,您可以混合使用鍵控和「非鍵控」元素,而且它們不必是連續的。另外,如果切片文字中缺少某個鍵,則索引將為前一個索引 1。

type step struct{}

var steps = []*step{
    0:       &step{},
    1:       &step{},
    &step{}, // implicit index: 2
    5:       &step{},
}
fmt.println(steps)

上述輸出(在 go playground 上嘗試):

[0x559008 0x559008 0x559008 <nil> <nil> 0x559008]

它們的鍵也可能“亂序”,這意味著這也是有效的:

var steps = []*Step{
    5:       &Step{},
    0:       &Step{},
    1:       &Step{},
    &Step{}, // implicit index: 2
}

這輸出相同。在 go playground 上嘗試。

以上是golang:如何定義步驟序列的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除