无法从map分配给struct成员

时间:2013-04-17 11:40:51

标签: map struct go

代码:

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没有效果?如果你想修改它的成员值,它是将结构指针保存到地图的唯一方法吗?

1 个答案:

答案 0 :(得分:7)

表达式dataA["classA"],如果类型为t_struct。这意味着

dataA["classA"].id = 2

等同于例如

t_struct{"some player", 42}.id = 2

Playground

IOW,结构值没有“home”,并且不能保持更改其字段。由于唯一的可能性是程序员的错误,编译器会标记错误。

OTOH:

dataB["classB"]

的类型为*t_struct。然后

dataB["classB"].id = 3

相当于

(*t_struct)(somePointer).id = 3

即,这个左值有一个“家”。这是指针指向的位置。对字段的更改将在那里“记录”,因此它是一个有效的Go操作(对结构字段的简单赋值,其中结构由指针引用)。