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 <nil> <nil> 0x559008]
它们的键也可能“乱序”,这意味着这也是有效的:
var steps = []*Step{ 5: &Step{}, 0: &Step{}, 1: &Step{}, &Step{}, // implicit index: 2 }
这输出相同。在 go playground 上尝试一下。
以上是golang:如何定义步骤序列的详细内容。更多信息请关注PHP中文网其他相关文章!