map结构体成员不能修改的问题
错误示例
刚刚上手,我们都会习惯性的向下面这样赋值 ,示例如下
package main
import "fmt"
type Math struct {
x, y int
}
var m = map[string]Math{
"foo": Math{2, 3},
}
func main() {
m["foo"].x = 4
fmt.Println(m["foo"].x)
}
但是这样一些就会报 cannot assign to struct field s[1].name in map 的错误
错误原因
x = y这种赋值的方式,你必须知道x的地址,然后才能把值y赋给x。- 但
go中的map的value本身是不可寻址的,因为map的扩容的时候,可能要做key/val pair迁移。value本身地址是会改变的 - 不支持寻址的话又怎么能赋值呢
解决方法
type Math struct {
x, y int
}
var m = map[string]*Math{
"foo": &Math{2, 3},
}
func main() {
m["foo"].x = 4
fmt.Println(m["foo"].x)
fmt.Printf("%#v", m["foo"]) // %#v 格式化输出详细信息
}
不能使用短变量声明设置结构体字段值
错误示例
type foo struct {
bar int
}
func main() {
var f foo
f.bar, tmp := 1, 2
fmt.Println(tmp)
}
修复代码:
type foo struct {
bar int
}
func main() {
var f foo
var tmp int
f.bar, tmp = 1, 2
fmt.Println(tmp)
}
直接返回的 T{} 不可寻址
错误示例
type T struct {
n int
}
func (t *T) Set(n int) {
t.n = n
}
func getT() T {
return T{}
}
func main() {
getT().Set(1)
}
修复代码:
type T struct {
n int
}
func (t *T) Set(n int) {
t.n = n
}
func getT() T {
return T{}
}
func main() {
t := getT()
t.Set(2)
fmt.Println(t.n)
}
Go语言中map结构体成员修改限制与解决方案
本文探讨了Go语言中map结构体值不可寻址导致的成员修改问题,通过实例演示如何将基本类型改为指针类型来解决,并揭示了短变量声明设置结构体字段值和直接返回空结构体不可赋值的常见误区。
2977

被折叠的 条评论
为什么被折叠?



