gpt4 book ai didi

戈朗 : declaring maps and slices with iota values

转载 作者:数据小太阳 更新时间:2023-10-29 03:28:25 26 4
gpt4 key购买 nike

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

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

最佳答案

您期望 range 在两种类型上的行为相同,但在第一种情况下,它在一个数组上取值,而您只有一个空索引 0。该值存储在 k 中 为当前索引; 0, 1, 2。在您的第二个示例中,您在 map 上进行测距并获取存储在 k 中的 key ,其中仅包含 1 和 2。

您可能想知道这是怎么发生的?就是因为这个;

var groups = [...]string{
fooGroup: "foo",
barGroup: "bar",
}

有点困惑(我觉得非常糟糕)的代码给了你这个;

var groups = [...]string{
1: "foo",
2: "bar",
}

这导致 groups 被分配/初始化为索引 0 中的空字符串。当然, map 不需要键 0 来让你在键 1 中放一些东西,所以它不会遇到同样的问题。如果这不仅仅是一个演示语言特性的练习,我强烈建议您摆脱故意混淆的代码,并为常量、类型和初始化使用更清晰的结构。

如果您对该机制持怀疑态度,请将以下几行添加到您的 main 中,您可以清楚地看到

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))

关于戈朗 : declaring maps and slices with iota values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31303966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com