golang:如何定义一个步骤序列

dwbf0jvd  于 2023-04-18  发布在  Go
关注(0)|答案(1)|浏览(94)

我想写一个协议测试。我目前的想法是定义一系列的步骤。每个步骤包含一个TriggerExpectation-例如,触发器MsgA和期望MsgB

type Series struct {
  Steps []Step
}

我不喜欢的是,Series不是显式的:我必须按顺序创建切片,然后希望它永远不会被弄乱,并依赖它,或者sort它,然后必须实现排序函数,这是完全不必要的。
什么是一个好的设计来正式定义Series,并以这种方式使它显式?
我现在最好的想法是创建一个带有int索引的map:

type Series struct {
   Steps map[int]Step
}

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

另一个选择是自己构建一个链表。go没有实现(afaik)。为此必须自己构建一个感觉很奇怪。但是这样的解决方案也会稍微放松显式特性:基本上,你总是必须通过链表来获得整个序列(例如,“什么是第4步”)。

cbeh67ev

cbeh67ev1#

除了使用map,你还可以使用slice和一个 keyed 复合文字:

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

这在Spec:复合文字:

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 ":"部分。
...键被解释为结构体文字的字段名,数组和切片文字的索引,以及Map文字的键。
注意,你可以混合使用keyed和unkeyed元素,它们不一定是连续的:

type Step struct{}

var steps = []*Step{
    0:       &Step{},
    1:       &Step{},
    &Step{}, // implicit index: 2
    10:      &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上尝试一下,如果一个slice文本中缺少一个键,索引将是前一个索引+ 1。

相关问题