Map作为函数形参的疑问
1. 运行环境
[操作系统]: 操作系统是Win10 64 企业版
[go 版本]: go version go1.16.3 windows/amd64
2. 问题描述?
我是Golang初学者,看到map作为形参时是引用类型,感觉map作为函数形参时,其在函数内外的内存地址应该是一致,就做了个实验。
结果发现map在函数内外是不同的内存地址。请大佬帮忙解惑。
代码如下:
import “fmt”
func TestMapInFunc() {
m := map[int]string {
1: “a”,
2: “b”,
3: “v”,
}
p := &m
//fmt.Printf(“m:%p\n”, m)
fmt.Printf(“m:%p\n”, p)
fmt.Printf(“MapInfo m:%v\n”, m)
modifyMap(m)
fmt.Printf(“after modify MapInfo m:%v\n”, m)
}
func modifyMap(m map[int]string) {
if _, ok := m[1]; ok {
m[1] = “The Second”
}
p1 := &m
fmt.Printf(“in function m:%p\n”, p1)
fmt.Printf(“in function modifyMap:%v\n”, m)
}
3. 您期望得到的结果?
map在函数modifyMap外部时,指针地址是0xc0000da018
作为形参进入函数内部后,指针地址是0xc0000da028。
我感觉作为引用类型,内存地址应该是一样的。向大佬们请教为什么是这样。
4. 您实际得到的结果?
m:0xc0000da018
MapInfo m:map[1:a 2:b 3:v]
in function m:0xc0000da028
in function modifyMap:map[1:The Second 2:b 3:v]
after modify MapInfo m:map[1:The Second 2:b 3:v]
go 的传参都是值拷贝,slice还是map都一样,复制的一个指向相同地址的值,但是如果slice或者map扩容后,它所指向的地址也会修改,你直接
fmt.Printf("%p",m)
才是map的地址studygolang.com/articles/10357