map的value本身的地址是不可寻的

题目:

下面代码输出什么?

1
2
3
4
5
6
7
8
9
10
11
12
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)
}
  • A. 4
  • B. compilation error

答案解析:

参考答案及解析:B,编译报错 cannot assign to struct field m["foo"].x in map。错误原因:对于类似 X = Y的赋值操作,必须知道 X 的地址,才能够将 Y 的值赋给 X,但 go 中的 map 的 value 本身是不可寻址的。

有两个解决办法:

a.使用临时变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
type Math struct {
x, y int
}

var m = map[string]Math{
"foo": Math{2, 3},
}

func main() {
tmp := m["foo"]
tmp.x = 4
m["foo"] = tmp
fmt.Println(m["foo"].x)
}

b.修改数据结构

1
2
3
4
5
6
7
8
9
10
11
12
13
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 格式化输出详细信息
}

references:

  1. https://blog.csdn.net/qq_36431213/article/details/82805043
  2. https://www.cnblogs.com/DillGao/p/7930674.html
  3. https://haobook.readthedocs.io/zh_CN/latest/periodical/201611/zhangan.html
  4. https://suraj.pro/post/golang_workaround/
  5. https://blog.ijun.org/2017/07/cannot-assign-to-struct-field-in-map.html

map的value本身的地址是不可寻的
http://example.com/2023/08/01/Go每日一题/map的value本身的地址是不可寻的/
作者
Feng Tao
发布于
2023年8月1日
更新于
2023年8月1日
许可协议