golang:如何定义步骤序列
php小编香蕉为您介绍如何在Golang中定义步骤序列。在软件开发中,经常需要按照一定的顺序执行一系列的操作或任务。Golang提供了一种简洁而有效的方式来定义和执行步骤序列。通过使用goroutine和channel,我们可以实现并发执行多个步骤,并确保它们按照指定的顺序执行。在本文中,我们将探讨如何定义步骤序列,并使用实例代码演示其用法。无论您是Golang初学者还是有经验的开发者,本文都将为您提供有价值的信息和实用的技巧。让我们一起来看看吧!
问题内容
我想编写一个协议测试。我目前的想法是定义一系列步骤。每个步骤都包含 trigger
和 expectation
- 例如触发 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:如何定义步骤序列的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341