为什么地图中没有键

Ken*_*tov 3 dictionary go

我创建了一张地图:

l := make(map[*A]string)
Run Code Online (Sandbox Code Playgroud)

其中A是:

type A struct{}
Run Code Online (Sandbox Code Playgroud)

然后在其中添加键值:

a1 := &A{}
a2 := &A{}
a3 := &A{}

l[a1] = "a1"
l[a2] = "a2"
l[a3] = "a3"
Run Code Online (Sandbox Code Playgroud)

我希望在做的时候看到所有的值("a1","a2","a3") range

for k, v := range l{
    fmt.Println(k, v)
}
Run Code Online (Sandbox Code Playgroud)

但我只看到最后一个.

为什么会这样? https://play.golang.org/p/GSdUWzExxLK

Adr*_*ian 8

因为你的struct没有字段,Go会将所有指向它的指针优化到同一个地址,所以你每次都使用相同的键.给结构一个字段(即使你从未在其中加入值),你将获得预期的行为.

游乐场:https://play.golang.org/p/n-WUZ9wqpGJ

您可以在Dave Cheney的博客上阅读有关空结构(包括此指针行为)的更多信息.

它仅在规范中简要提及,在Sizes和Alignments下,实际上是规范中的最后一句:

如果结构或数组类型不包含大小大于零的字段(或元素),则其大小为零.两个不同的零大小变量在内存中可能具有相同的地址.