gpt4 book ai didi

go - 为什么 map 值不可寻址?

转载 作者:IT王子 更新时间:2023-10-29 01:11:22 33 4
gpt4 key购买 nike

在玩 Go 代码时,我发现映射值是不可寻址的。例如,

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: cannot take the address of 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++ 背景,我不习惯这种似乎在 Go 中普遍存在的 not addressable 趋势。例如,下面的代码工作得很好:

#include<iostream>
#include<map>
#include<string>
using namespace std;
int main(){
map<int,string> mymap;
mymap[1] = "one";
string *myptr = &mymap[1];
cout<<*myptr;
}

如果有人能指出为什么在 Go 中无法实现(或故意未实现)相同的可寻址性,那就太好了。

最佳答案

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

关于go - 为什么 map 值不可寻址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38168329/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com