Golang中map内数组元素赋值报错cannot assign to m[1][0]的原因是什么?
Go 代码
cannot assign to m[1][0] 报错原因解析 核心原因
Go 中数组属于值类型,从 map 中读取元素时,返回的是原存储值的临时拷贝,该临时值是不可寻址的。你尝试直接对 m[1][0] 赋值时,修改的实际是这个临时数组拷贝的元素,修改完成后临时拷贝会被直接丢弃,并不会对 map 中存储的原数组产生任何影响,这种无意义的操作被 Go 编译器直接禁止,因此抛出对应报错。
你给出的第二段代码可以正常运行,是因为你将数组赋值给了可寻址的变量 a,对 a[0] 的赋值会直接作用到变量对应的数组存储上,操作是合法有效的。
补充说明
你提到的将 map 值类型从数组改为 slice 可以规避该问题,本质是因为 slice 属于引用类型:即使你从 map 中拿到的是 slice 的临时拷贝,拷贝内存储的底层数组指针和 map 中存储的 slice 指针指向同一块内存,修改 slice 元素的操作会作用到底层数组上,操作有实际意义,因此编译器允许该操作。
如果需要保留数组作为 map 的值类型,也可以通过两种方式完成修改:
- 先取出数组到临时变量,修改后再存回 map
m := map[int][2]int{1:{0,10}} tmp := m[1] tmp[0] = 1 m[1] = tmp
- 将 map 值类型声明为数组指针
m := map[int]*[2]int{1: {0,10}} m[1][0] = 1 // 可正常运行
内容的提问来源于stack exchange,提问作者Qaisar Sardar
相关产品推荐
相关产品推荐

