Go 为什么映射值不可寻址?
在使用Go代码时,我发现map值是不可寻址的。比如说,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]的地址 鉴于,
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])
),这是不同的。