【发布时间】:2020-04-27 20:49:21
【问题描述】:
通过使用full slice notationb = a[low:high:max],可以获得容量小于分配的切片a 的切片。切片b 的容量将为max - low,元素存储将与a 共享(不进行复制)。 max - low 必须小于或等于 cap(a),否则我们会感到恐慌:
a := make([]byte, 8)
b := a[:3:10]
panic: runtime error: slice bounds out of range [::10] with capacity 8
获得容量较小的切片的可能性有什么用?
我发现的唯一有用的应用程序是使用append 强制复制切片,从而绕过容量减少的切片的容量。
a := []int{1, 2, 3, 4, 5}
b := a[1:3:3]
fmt.Println("a:", a, "b:",b, "cap(b):", cap(b)) // -> a: [1 2 3 4 5] b: [2 3] cap(b): 2
b[0] = 6
fmt.Println("a:", a, "b:",b, "cap(b):", cap(b)) // -> a: [1 6 3 4 5] b: [6 3] cap(b): 2
b = append(b, 7) // copy slice elements and extends capacity of b
fmt.Println("a:", a, "b:",b, "cap(b):", cap(b)) // -> a: [1 6 3 4 5] b: [6 3 7] cap(b): 4
b[1] = 8
fmt.Println("a:", a, "b:",b, "cap(b):", cap(b)) // -> a: [1 6 3 4 5] b: [6 8 7] cap(b): 4
请注意,这样的副本并不明显,需要注释以使其对读者可见。
还有其他有用的应用吗?
【问题讨论】: