You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:07:34