我的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)
最后一行没有编译,它说"不能分配给它"
我想知道这是什么原因?
为了给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)
由于此处描述的原因,这是不合法的:
查询地图会给出存储项目的副本,因此没有必要为其分配。
推荐的解决方法是:
var xxoo = dictionary["xxoo"]
xxoo.b = 5.0
dictionary["xxoo"] = xxoo
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |