首先为什么讨论这个基础的问题,因为博主今天在写代码的时候又遇到了这个基础的问题,之前也遇到过,但是没有记录,所以又忘记了,还是那句话好记性不如烂笔头,记录下来。
问题是这样的,我要去修改内存中的map里头的数据,发现改了怎么也没生效,于是写了个demo验证
package main
import (
"fmt"
)
func main() {
clothesMap := map[int]Clothes{
1:{
"Nike",
300,
},
2:{
"Adidas",
300,
},
}
fmt.Println("clothesMap:", clothesMap[2])
for k,v := range clothesMap {
if k == 2 {
v.price --
fmt.Println("v.times:", v.price)
}
}
fmt.Println("clothesMap:", clothesMap[2])
}
type Clothes struct {
name string
price int
}
输出:
clothesMap: {
Adidas 300}
v.times: 299
clothesMap: {
Adidas 300}
看到这个结果就能发现在遍历时,value是map中的数据拷贝,我们修改的只是拷贝后的数据,并不是原数据,面对这类问题两种解决方法
- 修改后,把对应的key,value再次放入map覆盖之前的即可
- 定义的时候定义指针类型,修改的时候就修改的是指针类型,例如
package main
import (
"fmt"
)
func main() {
clothesMap := map[int