Go语言切片如何用_Go语言slice切片操作教程【推荐】

张开发
2026/4/16 19:37:35 15 分钟阅读

分享文章

Go语言切片如何用_Go语言slice切片操作教程【推荐】
Go切片创建需避免内存坑用make预分配容量防扩容字面量适合小数据截取共享底层数组需copy隔离nil切片与空切片不同append扩容策略影响性能删除元素需拼接而非赋零值。切片怎么创建才不踩内存坑Go 切片不是数组它只是底层数组的一段“视图”创建方式直接决定后续是否共享内存、是否频繁扩容。make([]int, 3, 5)明确长度为 3、容量为 5推荐用于预知规模的场景比如解析固定字段 JSON、读取文件块避免 append 过程中多次复制[]int{1,2,3}字面量初始化lencap3简洁安全适合小数据或配置项arr[1:4]从数组或切片截取会共享底层数组——改 sub[0] 可能悄悄改掉原数组里相邻位置的值var s []intnil 切片len(s) 和 cap(s) 都是 0s nil 为 true而 s : []int{} 是空切片非 nilcap(s) 可能非 0取决于底层实现别用 nil 判断“有没有元素”append 之后 len 和 cap 怎么变append 看似简单但它的行为由当前容量决定不是每次加一都只涨 1。容量够用时append 只增加 lencap 不变O(1) 操作容量不够时Go 自动分配新底层数组复制旧数据cap 按策略增长——小于 1024 元素时翻倍≥1024 时约增 25%示例s : make([]int, 0, 2)连续 append(s, 0,1,2,3,4) 后cap 依次为 2→4→8中间触发两次扩容风险点如果在循环里无预分配地反复 append可能产生多轮内存分配拷贝性能骤降尤其处理上千条日志或 HTTP body 时怎么安全地截取又不污染原数据用 s[low:high] 截取非常快O(1)但默认共享底层数组这是最常被忽略的隐性耦合。想完全隔离用 copy 创建副本dst : make([]int, len(src)); copy(dst, src)想限制子切片容量防后续误 append 越界影响原数组用三参数切片表达式 s[low:high:max]例如 arr : [5]int{1,2,3,4,5}; sub : arr[1:3:3]此时 sub 的 cap2再 append(sub, 99) 就会新建底层数组不影响 arr错误示范s1 : arr[1:3]; s2 : arr[2:4]; s1[1] 99 → s2[0] 也变成 99因为它们共用同一段内存删除元素为什么不能直接 s[i] nilGo 没有内置“删除索引 i 元素”的语法s[i] nil 只是把该位置设为零值对 int 是 0对指针是 nillen 并没变这不是删除。 Vozo Vozo是一款强大的AI视频编辑工具可以帮助用户轻松重写、配音和编辑视频。

更多文章