无法在地图中分配对

Wha*_*rld 5 dictionary go

我的go程序中定义了以下对

type pair struct {
  a float64
  b float64
}
Run Code Online (Sandbox Code Playgroud)

然后我创建一个地图:

dictionary map[string]pair
Run Code Online (Sandbox Code Playgroud)

我先添加一个元素:

dictionary["xxoo"] = pair{5.0, 2.0}
Run Code Online (Sandbox Code Playgroud)

然后我试着这样做:

dictionary["xxoo"].b = 5.0  // try to change from 2.0 to 5.0
Run Code Online (Sandbox Code Playgroud)

最后一行没有编译,它说"不能分配给它"

我想知道这是什么原因?

Jim*_*imB 6

为了给struct字段赋值,该结构必须是"可寻址的".可寻址性包含在语言规范的"地址运算符"部分中.

地图值不可寻址,以使地图实现能够根据需要自由地在内存中移动值.由于映射值不可寻址,因此您无法.在值上使用selector()运算符来分配给struct字段.如果使用指针类型作为映射值,即map[string]*pair指针间接满足可寻址性要求.

dict := make(map[string]*pair)
dict["xxoo"] = &pair{5.0, 2.0}
dict["xxoo"].b = 5.0
Run Code Online (Sandbox Code Playgroud)

如果使用值,则需要通过赋值复制现有值,或者提供全新值:

dict := make(map[string]pair)
dict["xxoo"] = pair{5.0, 2.0}

// copy the value, change one field, then reassign
p := dict["xxoo"]
p.b = 5.0
dict["xxoo"] = p

// or replace the value in full
dict["xxoo"] = pair{5.0, 5.0}
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 3

由于此处描述的原因,这是不合法的:

查询地图会给出存储项目的副本,因此没有必要为其分配。

推荐的解决方法是:

var xxoo = dictionary["xxoo"]
xxoo.b = 5.0
dictionary["xxoo"] = xxoo
Run Code Online (Sandbox Code Playgroud)