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)
}