登录
首页 >  Golang >  Go问答

golang:如何定义顺序规则

来源:stackoverflow

时间:2024-02-06 18:30:23 112浏览 收藏

你在学习Golang相关的知识吗?本文《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   0x559008]

它们的键也可能“乱序”,这意味着这也是有效的:

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

这输出相同。在 go playground 上尝试一下。

理论要掌握,实操不能落!以上关于《golang:如何定义顺序规则》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>