dictionary - 为什么地图中没有键
问题描述
我创建了一张地图:
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)
}
但我只看到最后一个。
解决方案
因为你的结构没有字段,Go 优化了指向它的所有指针指向相同的地址,所以你每次都使用相同的键。给结构一个字段(即使您从未在其中输入值),您将获得预期的行为。
游乐场: https: //play.golang.org/p/n-WUZ9wqpGJ
您可以在 Dave Cheney 的博客上阅读更多关于空结构(包括这种指针行为)的信息。
它在规范中仅在Sizes 和 Alignments下简要提及,实际上是规范中的最后一句话:
如果结构或数组类型不包含大小大于零的字段(或元素),则其大小为零。两个不同的零大小变量在内存中可能具有相同的地址。
推荐阅读
- javascript - 具有某些权重年龄值的对象值数组未按正确顺序排列
- django - 在其他表中显示外键计数
- c - 如何在一个 C 源文件中正确使用 2 个结构定义
- java - 如何修复 - 线程“主”java.lang.NullPointerException 中的异常 - 在 Eclipse 中
- c - 如何使 flex 使用包含文本的文件 (.txt/.c/etc.) 作为其输入
- javascript - 使用 async/await 在 addLocaleData 上动态导入语言环境
- c# - 不同类列表中的类特定方法
- android - 反应本机相机在第二次调用时不起作用
- php - error_handlers 页面在部署时不显示
- python - 为什么 imshow 显示像素位置的非整数 x 和 y 值?