回答

收藏

将值设置为结构作为映射中的值时,为什么会出现“cannot assign”错误?

技术问答 技术问答 433 人阅读 | 0 人回复 | 2023-09-12

新的。遇到这个错误,却找不到原因或理由:# c6 w; }3 A$ J4 B. s; s" v) D
如果我创建了一个结构,我显然可以毫无问题地分配和重新分配值:# S+ z% Z& v. |& h5 D* ]
    type Person struct { name string age int}func main() {  x := Person{"Andy Capp",98}  x.age = 99  fmt.Printf("age: %d\n",x.age)}
    2 U. z- @% _( T5 @
但如果结构是地图上的一个值:
( Z% ~$ Z. N" t* }5 P
    type Person struct      name string     age int }type People map[string]Personfunc main() {  p := make(People)  p["HM"] = Person{"Hank McNamara",39}  p["HM"].age = p["HM"].age   1  fmt.Printf("age: %d\n",p["HM"].age)}( `2 A! G" w/ W9 o1 K/ y7 f
我明白了cannot assign to p["HM"].age。没有其他信息。http://play.golang.org/p/VRlSItd4eP
; K. F! o" }! `8 p! _我找到了解决这个问题的方法 -incrementAge在 Person 创建一个func,它可以调用并将结果分配给映射键,例如p["HM"] = p["HM"].incrementAge().
) @: V, @2 p/ J! Y3 H4 V% Z" d但我的问题是,这个不能分配错误的原因是什么,为什么不允许我直接分配结构值呢?/ G- W& R! k* Z4 R+ H
                                                               
4 n8 T5 z7 p9 i4 ]3 y# t& b6 H    解决方案:                                                                ! J3 c- G! V9 `& f# n1 o- n7 Q% l5 v
                                                                p["HM"]不是常规的可寻址值:hashmap 可以在运行过程中生长,然后它们的值在内存中移动,旧位置过时。如果映射中的值被视为传统的可搜索值,则map实现的内部结构就会暴露出来。
) W0 P6 ?8 F; W* U# a; G因此,在规范中p["HM"]称为地图索引表达式的东西略有不同;如果你在标准中搜索短语索引表达式,你会发现你可以对它们进行一些操作,比如读取它们,分配给它们,并在增量/减量表达式中使用它们(数字类型)。但你不能做任何事。他们本可以选择比他们更好更多的特殊情况,但我猜他们不仅仅是为了让事情变得简单。, H$ \: _  [, w* A
你的方法在这里看起来不错——你把它改成常规分布,这是特别允许的操作之一。另一种方法(可能适用于你想避免复制的大结构?)使映射值成为常规的旧指针,可以通过以下方式修改底部对象:
" S3 ?& w9 r' A2 b
    package mainimport "fmt"type Person struct    name string    age  int}type People map[string]*Personfunc main()    p := make(People)    p["HM"] = &erson{"Hank McNamara",39}    p["HM"].age  = 1    fmt.Printf("age: %d\n",p["HM"].age)}8 Q2 q8 Y& J4 T
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则