Golang中array[:]与手动构造slice的差异及遍历map问题解析
Golang数组转切片的两种方式差异及问题原因
核心本质差异
在Go语言里,数组是值类型,而切片是引用类型——切片本身不存储实际数据,只是指向底层的数组空间。这是两种转换方式产生不同结果的根本原因。
为什么k[:]会导致重复
遍历map[[3]int]bool时,range循环会复用同一个循环变量k。每次循环,当前map的key(数组)会被赋值给这个复用的k变量。
用k[:]生成的切片,它的底层数组就是循环变量k的数组空间。因为k是被重复使用的,后续循环会覆盖它的值,所以你append到res里的所有切片,最终都指向同一个底层数组,最后显示的自然都是最后一次循环的k值,看起来就是重复的。
手动构造切片为什么正确
[]int{k[0],k[1],k[2]}这种方式,是直接创建了一个新的切片,并且把当前k的三个元素值复制到了这个新切片的底层数组里。每个循环生成的切片都有自己独立的底层数组,互相之间不会被覆盖,所以最终res里的每个元素都是正确的去重后的值。
直观验证方法
你可以打印每个切片的底层数组地址(比如&res[i][0]),用k[:]的话所有地址都相同,手动构造的则每个都不一样,这就能直接看出底层数组是否被复用了。
内容的提问来源于stack exchange,提问作者CeerDecy
相关产品推荐
相关产品推荐

