Why do I get a “cannot assign” error when setting value to a struct as a value in a map?
全新体验。遇到此错误,无法找到原因或原因:
如果我创建一个结构,我可以很明显地分配和重新分配值,没有问题:
1 2 3 4 5 6 7 8 9 10 11 | type Person struct { name string age int } func main() { x := Person{"Andy Capp", 98} x.age = 99 fmt.Printf("age: %d ", x.age) } |
但如果结构是映射中的一个值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | type Person struct { name string age int } type People map[string]Person func main() { p := make(People) p["HM"] = Person{"Hank McNamara", 39} p["HM"].age = p["HM"].age + 1 fmt.Printf("age: %d ", p["HM"].age) } |
号
我得到了
我找到了一种解决方法——创建一个
但是,我的问题是,这个"不能分配"错误的原因是什么,为什么不允许我直接分配结构值呢?
因此,
您的方法在这里似乎很好——您将其更改为常规分配,这是特别允许的操作之一。另一种方法(也许对您希望避免复制的大型结构比较好?)使映射值成为常规的旧指针,您可以通过以下方式修改基础对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package main import"fmt" type Person struct { name string age int } type People map[string]*Person func main() { p := make(People) p["HM"] = &Person{"Hank McNamara", 39} p["HM"].age += 1 fmt.Printf("age: %d ", p["HM"].age) } |
任务的左侧必须为"可寻址"。
https://golang.org/ref/spec分配
Each left-hand side operand must be addressable, a map index expression, or (for = assignments only) the blank identifier.
号
和https://golang.org/ref/spec_address_operators
The operand must be addressable, that is, either a variable, pointer indirection, or slice indexing operation; or a field selector of an addressable struct operand; or an array indexing operation of an addressable array.
号
正如@twotwootwo的评论,