代码:
type t_struct struct {
player string
id int
}
func main() {
dataA := make(map[string]t_struct)
dataB := make(map[string]*t_struct)
var playerA t_struct
playerA.player = "tom"
playerA.id = 1
dataA["classA"] = playerA
dataA["classA"].id = 2 // ERROR, why?
playerB := new(t_struct)
dataB["classB"] = playerB
dataB["classB"].player = "rick"
dataB["classB"].id = 3
}
得到错误:
无法分配给dataA [“classA”]。id
我想知道为什么dataA["classA"].id = 2
无效但dataB["classB"].id = 3
没有效果?如果你想修改它的成员值,它是将结构指针保存到地图的唯一方法吗?
答案 0 :(得分:7)
表达式dataA["classA"]
,如果类型为t_struct
。这意味着
dataA["classA"].id = 2
等同于例如
t_struct{"some player", 42}.id = 2
IOW,结构值没有“home”,并且不能保持更改其字段。由于唯一的可能性是程序员的错误,编译器会标记错误。
OTOH:
dataB["classB"]
的类型为*t_struct
。然后
dataB["classB"].id = 3
相当于
(*t_struct)(somePointer).id = 3
即,这个左值有一个“家”。这是指针指向的位置。对字段的更改将在那里“记录”,因此它是一个有效的Go操作(对结构字段的简单赋值,其中结构由指针引用)。