Golang:使用iota值声明地图和切片

时间:2015-07-08 21:19:06

标签: go

我有这个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

我想知道为什么不同的输出?

1 个答案:

答案 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