无法从map分配给struct成员

Rec*_*Hou 1 struct map 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
}
Run Code Online (Sandbox Code Playgroud)

并得到错误:

无法分配给dataA ["classA"].id

我想知道为什么dataA["classA"].id = 2不工作但是dataB["classB"].id = 3呢?如果要修改它的成员值,它是将结构指针保存到地图的唯一方法吗?

zzz*_*zzz 7

表达式dataA["classA"]if类型t_struct.这意味着

dataA["classA"].id = 2
Run Code Online (Sandbox Code Playgroud)

是等价的,例如

t_struct{"some player", 42}.id = 2
Run Code Online (Sandbox Code Playgroud)

操场

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

OTOH:

dataB["classB"]
Run Code Online (Sandbox Code Playgroud)

有类型*t_struct.然后

dataB["classB"].id = 3
Run Code Online (Sandbox Code Playgroud)

相当于

(*t_struct)(somePointer).id = 3
Run Code Online (Sandbox Code Playgroud)

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

  • @jnml:你应该在答案中说明问题只是因为索引地图是不可寻址的.否则听起来像`t_struct`类型的任何表达都不能改变它的字段. (2认同)