为什么地图值不可寻址?

Tan*_*arg 7 go

在使用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)
}
Run Code Online (Sandbox Code Playgroud)

生成错误

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)
}
Run Code Online (Sandbox Code Playgroud)

工作得非常好.

为什么会这样?为什么Go开发人员选择使某些值无法解决?这是语言的缺点还是一个特征?

编辑:从C++背景来看,我不习惯这种not addressable似乎在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;
}
Run Code Online (Sandbox Code Playgroud)

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

DAX*_*lic 14

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