首页 > 解决方案 > 为什么地图中没有键

问题描述

我创建了一张地图:

l := make(map[*A]string)

其中 A 是:

type A struct{}

然后在其中添加键值:

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

l[a1] = "a1"
l[a2] = "a2"
l[a3] = "a3"

我希望在执行时看到所有值(“a1”、“a2”、“a3”)range

for k, v := range l{
    fmt.Println(k, v)
}

但我只看到最后一个。

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

标签: dictionarygo

解决方案


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

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

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

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

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


推荐阅读