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]

讨论数量: 4

go 的传参都是值拷贝,slice 还是 map 都一样,复制的一个指向相同地址的值,但是如果 slice 或者 map 扩容后,它所指向的地址也会修改,你直接 fmt.Printf("%p",m) 才是 map 的地址

studygolang.com/articles/10357

3年前 评论
rognar (楼主) 3年前
whitek (作者) 3年前
rognar (楼主) 3年前