cannot assign to struct field people[name].isDead in map
这个报错有点迷,我估计很多人都看不懂了。我解答下, map 底层使用了 array 存储数据,并且没有容量限制,随着 map 元素的增多,需要创建更大的 array 来存储数据,那么之前的地址就无效了,因为数据被复制到了新的更大的 array 中,所以 map 中元素是不可取址的,也是不可修改的。这个报错的意思其实就是不允许修改 map 中的元素。
即便 map 中元素没有以上限制,这段代码依然是错误的,想一想,为什么?答案之前已经说过了。
那么,怎么改才能正确呢,老套路,依然是使用指针:
package main
import "fmt"
type person struct {
name string
age byte
isDead bool
}
func main() {
p1 := &person{name: "zzy", age: 100}
p2 := &person{name: "dj", age: 99}
p3 := &person{name: "px", age: 20}
people := map[string]*person{
p1.name: p1,
p2.name: p2,
p3.name: p3,
}
whoIsDead(people)
if p3.isDead {
fmt.Println("who is dead?", p3.name)
}
}
func whoIsDead(people map[string]*person) {
for name, _ := range people {
if people[name].age < 50 {
people[name].isDead = true
}
}
}
另外,在 interface{} 断言里试图直接修改 struct 属性而非通过指针修改时:
package main
type person struct {
name string
age byte
isDead bool
}
func main() {
p := person{name: "zzy", age: 100}
isDead(p)
}
func isDead(p interface{}) {
if p.(person).age < 101 {
p.(person).isDead = true
}
}
会直接报一个编译错误:
cannot assign to p.(person).isDead
即便编译通过,代码也是错误的 ,始终要记住 struct 是值类型的数据,请使用指针去操作它, 正确做法是:
package main
import "fmt"
type person struct {
name string
age byte
isDead bool
}
func main() {
p := &person{name: "zzy", age: 100}
isDead(p)
fmt.Println(p)
}
func isDead(p interface{}) {
if p.(*person).age < 101 {
p.(*person).isDead = true
}
}
最后,不能不说golang中指针真是居家旅行、升职加薪的必备知识啊,希望同学们熟练掌握。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对易采站长站的支持。









