搜索引擎的网站优化,WordPress 付费下载阅读,多用户商城系统价格,深圳代理记账多少钱背景
关于slice和map是指传递还是引用传递#xff0c;很多文章都分析得模棱两可#xff0c;其实在Go中只有值传递#xff0c;但是很多情况下是因为分不清slice和map的底层实现#xff0c;所以导致很多人在这一块产生疑惑#xff0c;下面通过代码案例分析slice和map到底是…背景
关于slice和map是指传递还是引用传递很多文章都分析得模棱两可其实在Go中只有值传递但是很多情况下是因为分不清slice和map的底层实现所以导致很多人在这一块产生疑惑下面通过代码案例分析slice和map到底是值传递还是引用传递。
案例分析
func main() {list : make([]int, 10)fmt.Printf(list addr:%p\n, list)fmt.Println(list size:, len(list))listExpand(list)fmt.Println(expand list size:, len(list))m : make(map[int]int, 0)fmt.Printf(map addr:%p\n, m)fmt.Println(map size:, len(m))mapExpand(m)fmt.Println(expand size:, len(m))
}func mapExpand(m map[int]int) {for i : range 10 {m[i] i}fmt.Printf(expand map addr:%p\n, m)
}func listExpand(list []int) {for i : range 10 {list append(list, i)}fmt.Printf(expand list addr:%p\n, list)
}
上面代码的输出结果
list addr:0xc000010500
list size: 10
expand list addr:0xc0000220a0
expand list size: 10
map addr:0xc00001e180
map size: 0
expand map addr:0xc00001e180
expand size: 10可以清楚的看到都没有使用指针的情况下两者的结果都不一样map在扩容前后都是同一个内存地址但是slice在没扩容都不为同一个内存地址。 可能会更疑惑了这结果是想说明map是引用传递slice是值传递吗
在Go的1.8版本源码中 hashmap的make实现如下 可以清楚的看到通过make创建的map其实返回的是hamp结构体的指针。 slice的make实现如下 可以清楚的看到通过make创建的slice其实返回的是slice的结构体并不是指针。
所以结论很清晰了其实Go中只有值传递因为各个引用类型底层实现的不同导致的结果不一致因为创建map返回的是指针所以传递map时扩容了也不会导致和预期不一样的结果而slice的创建返回的是结构体如果扩容了则会导致底层数组的变化不一定是预期的结果。