在 Go 中,内置函数 append、len 和 cap 在处理切片时起着关键作用。
示例:
arr := []int{1,2,3} arr2 := append(arr, 4) // arr2 可能在同一个或新的后备数组中,具体取决于 cap(arr)
细节:
如果对切片“切掉”一部分并通过 append 添加元素,会影响原始数组吗?
回答:如果 cap 允许,append 会将元素“写入”原始数组的末尾,所有引用同一数组的切片都能看到这些变化。
示例:
a := []int{1,2,3,4} b := a[:2] // [1 2], len=2, cap=4 b = append(b, 10) // a 发生变化: a -> [1, 2, 10, 4]
故事
团队在子切片中添加元素,结果父数组中的数据意外改变——这导致了业务逻辑不协调,并在用户之间的任务分配中造成了难以调试的错误。
故事
在对一个大切片多次调用 append 时,期望新数组一直重新分配,但实际上,系统的几个部分继续使用同一个“后备数组”,引发了竞争条件和数据损坏。
故事
开发者使用 make 分配固定大小的切片,但错误地交换了参数位置:make([]int, cap, len)。结果,关注容量的逻辑意外地按长度工作,导致在超出 s[0:len] 时出现恐慌。