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