Golang数组和切片有什么区别_Golang数组切片对比教程【通俗】

张开发
2026/6/25 1:07:39 15 分钟阅读
Golang数组和切片有什么区别_Golang数组切片对比教程【通俗】
数组传参改不了原值切片能改但可能意外影响别人大数组应传指针或转切片截取切片需防重叠用copy隔离数据len是当前长度cap是容量上限预估最大量设cap可避免频繁扩容数组可比较、作map键切片不可。数组传参改不了原值切片能改但可能意外影响别人Go里arr [3]int传进函数后函数里改的是副本外面完全没变而s []int传进去改的是底层数组原切片能看到变化——但危险在于如果多个切片共享同一底层数组一个append或赋值可能悄悄改掉另一个的元素。大数组别直接传参要么传*[1024]byte指针要么转成切片再传截取切片时注意重叠a : arr[1:3]和b : arr[2:4]共用arr[2]改a[1]等于改b[0]需要隔离数据用copy(dst, src)新建独立切片别依赖make([]T, len(src))后直接赋值len和cap不是一回事扩容时机全看cap够不够len(s)是你现在能读写的元素个数cap(s)是“还能往里塞多少而不换底层数组”。很多bug就出在以为len cap结果append后返回的新切片指向了新地址老变量还指着旧内存。s : make([]int, 0, 5)长度0、容量5第一次append(s, 1)不扩容底层数组还是那块s : []int{1,2,3}长度3、容量也是3再append必然扩容底层数组大概率换地方频繁追加预估最大量设好cap比如日志缓冲make([]byte, 0, 4096)省掉多次复制初始化写法决定底层是否复用零值行为也完全不同数组零值是[3]int{0,0,0}切片零值是nil。这直接影响if s nil判断和append行为——对nil切片append是安全的但对nil数组压根不能nil数组它必须有长度。var s []int → s是nillen(s)0且cap(s)0可直接appendvar a [3]int → a是[3]int{0,0,0}不能append也不能nil比较s : []int(nil)和s : []int{}都合法但前者cap0后者cap通常为小整数如2影响首次扩容策略什么时候非用数组不可固定大小可比较当map键切片不能做map的键也不能用直接比较数组可以。典型场景SHA256哈希值[32]byte、RGB颜色[3]uint8、矩阵行[4]float64。 Vozo Vozo是一款强大的AI视频编辑工具可以帮助用户轻松重写、配音和编辑视频。

更多文章