在Go函数内调用make()为何无法初始化传引用的变量?
Go中map作为函数参数时的初始化问题解析
你遇到的核心问题是对Go语言的参数传递机制理解有误:Go里所有参数传递都是值传递,哪怕是map这种引用类型,传递的也是引用的副本。
问题原因拆解
你的示例代码中:
myMaps := make([]map[byte]bool, 10)创建了一个包含10个nil map的切片- 循环遍历切片时,
m是每个nil map引用的副本 - 调用
updateMap(m)时,函数内的m又是这个副本的拷贝。当你执行m = make(map[byte]bool),只是修改了函数内这个局部变量的引用指向,原切片里的nil map完全没被改变 - 后续给
m['c']赋值,操作的是函数内新创建的map,函数执行完这个局部map就被销毁,原切片里的元素依然是nil,所以输出为空
而如果在循环内提前初始化m = make(map[byte]bool),此时传给updateMap的是一个指向有效map的引用副本,函数内修改这个引用指向的底层map数据(而非引用本身),原切片里的map和函数内的map指向同一个底层结构,所以修改能同步,输出符合预期。
修正方案
方案1:传递map的指针
通过传递map的指针,让函数可以直接修改原变量的引用指向:
package main import "fmt" func updateMap(m *map[byte]bool) { if *m == nil { *m = make(map[byte]bool) } (*m)['c'] = true } func main() { myMaps := make([]map[byte]bool, 10) for i := range myMaps { updateMap(&myMaps[i]) fmt.Println(myMaps[i]) } }
方案2:让函数返回更新后的map
将函数处理后的map返回,再赋值给原切片元素:
package main import "fmt" func updateMap(m map[byte]bool) map[byte]bool { if m == nil { m = make(map[byte]bool) } m['c'] = true return m } func main() { myMaps := make([]map[byte]bool, 10) for i := range myMaps { myMaps[i] = updateMap(myMaps[i]) fmt.Println(myMaps[i]) } }
内容的提问来源于stack exchange,提问作者glarik
相关产品推荐
相关产品推荐

