Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang:声明具有iota值的地图和切片_Go - Fatal编程技术网

Golang:声明具有iota值的地图和切片

Golang:声明具有iota值的地图和切片,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", barG

我有这个密码:

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

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

您希望
range
在这两种类型上表现相同,但在第一种情况下,它在数组上进行排列,而您只有一个空索引0。存储在
k
中的值是当前索引;0, 1, 2. 在第二个示例中,您在地图上进行测距,并获取存储在
k
中的密钥,其中仅包含1和2

你可能想知道这是怎么发生的?因为这个,

var groups = [...]string{
    fooGroup: "foo",
    barGroup: "bar",
}
有点让人困惑(我觉得很糟糕)的代码给了你这个

var groups = [...]string{
    1: "foo",
    2: "bar",
}
这导致
被分配/初始化为索引0中的空字符串。当然,地图不需要键0就可以在键1中放置某些内容,这样它就不会遇到同样的问题。如果这不仅仅是一个演示该语言特性的练习,我强烈建议您摆脱故意混淆的代码,使用更清晰的常量、类型和初始化结构

如果你对这一机制持怀疑态度,那么在你的主要观点中加入以下几行,你就能清楚地看到

fmt.Printf("Lenght of groups is %d and index 0 is %s\n", len(groups), groups[0])
fmt.Printf("Lenght of xGroups is %d\n", len(xGroups))

是一个数组,“foo”位于索引1,“bar”位于索引2;所以0只是一个默认值(空字符串),但在技术上仍然存在。xGroups是一个只包含1和2项的映射。还值得注意的是,映射的迭代顺序没有定义,即使在后续运行中也可能不同。