Go 为什么映射值不可寻址?

Go 为什么映射值不可寻址?,go,Go,在使用Go代码时,我发现map值是不可寻址的。比如说, package main import "fmt" func main(){ var mymap map[int]string = make(map[int]string) mymap[1] = "One" var myptr *string = &mymap[1] fmt.Println(*myptr) } 产生错误 mapaddressable.go:7:无法获取mymap[1]的地址 鉴于,

在使用Go代码时,我发现map值是不可寻址的。比如说,

package main
import "fmt"

func main(){
    var mymap map[int]string = make(map[int]string)
    mymap[1] = "One"
    var myptr *string = &mymap[1]
    fmt.Println(*myptr)
}
产生错误

mapaddressable.go:7:无法获取mymap[1]的地址

鉴于,本准则

package main
import "fmt"

func main(){
    var mymap map[int]string = make(map[int]string)
    mymap[1] = "One"
    mystring := mymap[1]
    var myptr *string = &mystring
    fmt.Println(*myptr)
}
很好用

为什么会这样?为什么Go开发人员选择使某些值不可寻址?这是语言的缺点还是特点

编辑: 从C++背景来看,我不习惯于这个代码>不可寻址的< /C> >趋势,在GO中似乎很流行。例如,以下代码可以正常工作:

#include<iostream>
#include<map>
#include<string>
using namespace std;
int main(){
    map<int,string> mymap;
    mymap[1] = "one";
    string *myptr = &mymap[1];
    cout<<*myptr;
}
#包括
#包括
#包括
使用名称空间std;
int main(){
地图我的地图;
mymap[1]=“一”;
字符串*myptr=&mymap[1];

cout我不知道maps的内部Go实现,但很可能它是一种哈希表。因此,如果您获取并保存其中一个条目的地址,然后再将另一组条目放入其中,则保存的地址可能无效。这是由于当加载因子超过ce时,哈希表的内部重组阈值和哈希表需要增长。
因此,我想它是不允许采取其条目之一的地址,以避免此类错误

来自C++背景。

为什么[Go]映射值不可寻址


如果所有其他语言都像C++,那么没有其他语言就没有意义了。 C++是一种复杂的、难以阅读的语言

Go是一种简单易读的语言


Go映射是哈希映射。对映射键应用确定性哈希函数。哈希值用于确定条目(键值对)的主映射桶。一个存储桶存储一个或多个映射项。主存储桶可能会溢出到辅助存储桶。存储桶被实现为一个数组。随着映射项的数量通过插入而增加,哈希函数将进行调整以提供更多存储桶。映射项将以增量方式复制到一个新的、更大的存储桶数组中。如果映射项的数量减少删除时,可以回收空间

总之,Go映射是一种动态的自组织数据结构。条目(键值对)的内存地址不是固定的。因此,映射值不可寻址


在GO中,map值可寻址不是必需的。

也见顶回答,它是一个散列值,它在桶中存储值。当它重新计算值移动时。如果你想绕过这个问题,用一个指针作为值类型将执行它。C++ +Calp>map s逃脱它,因为它们是不需要移动现有点头的二叉树。在RAM中添加新的(但它的操作平均为O(log n),而不是O(1))。C++ >代码unGordEdmap 是一个哈希表,但必须对实现施加一定限制,以避免值移动;并且讨论。我认为您的意思是“代码> map是可寻址的< /C>(例如,GEX>代码> M>代码),但是<代码> MAP元素不是可寻址的< /代码>。(例如
&(m[1])
),这是不同的。