我有这个Go代码:
package main
import "fmt"
type baseGroup int
const (
fooGroup baseGroup = iota + 1
barGroup
)
var groups = [...]string{
fooGroup: "foo",
barGroup: "bar",
}
var xGroups = map[baseGroup]string{
fooGroup: "foo",
barGroup: "bar",
}
func main() {
fmt.Println("groups")
for k, v := range groups {
fmt.Println(k, v)
}
fmt.Println("xGroups")
for k, v := range xGroups {
fmt.Println(k, v)
}
}
如果我运行代码我得到:
groups
0
1 foo
2 bar
xGroups
1 foo
2 bar
我想知道为什么不同的输出?
答案 0 :(得分:0)
您希望range
在两种类型上的行为相同,但在第一种情况下,它在数组上的范围内,您只有一个空索引0.该值存储在{ {1}}是当前索引; 0,1,2。在第二个示例中,您将对地图进行测距并将密钥存储在仅包含1和2的k
中。
您可能想知道这是怎么回事?这是因为这个;
k
令人困惑(非常糟糕)的代码正在给你这个;
var groups = [...]string{
fooGroup: "foo",
barGroup: "bar",
}
这导致var groups = [...]string{
1: "foo",
2: "bar",
}
在索引0中使用空字符串进行分配/初始化。当然,地图不需要键0就可以让你在键1中放置一些东西,所以它没有& #39;遭遇同样的问题。如果这不仅仅是演示语言功能的练习,我强烈建议您摆脱有意混淆的代码,并为常量,类型和初始化使用更清晰的结构。
如果您对该机制持怀疑态度,请在主要内容中添加以下行,您可以清楚地看到
groups