gpt4 book ai didi

go - 完整表示法a [low : high : max]?

转载 作者:行者123 更新时间:2023-12-01 20:24:14 25 4
gpt4 key购买 nike

通过使用full slice notation b = a[low:high:max],可以获得比分配的 slice a容量小的 slice 。 slice b的容量将为max - low,并且元素存储将与a共享(不进行任何复制)。 max - low必须小于或等于cap(a),否则我们会感到 panic :

a := make([]byte, 8)
b := a[:3:10]

panic: runtime error: slice bounds out of range [::10] with capacity 8

获得较小容量的 slice 的可能性有什么用?

我发现的唯一有用的应用程序是使用 append强制 slice 的副本,以降低容量来绕过 slice 的容量。
    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


请注意,这样的副本并不明显,需要注释以使其对读者可见。

其他有用的应用程序吗?

最佳答案

它确实在添加时强制执行复制,但是这样做的一般性略强于此。如果使用它,则可以将 slice 传递给一些未知的代码段,因为该代码将无法使用该 slice 读取或写入比您想要的更多的基础数组。

通过正常 slice 表达式创建的 slice 将具有足够的容量,可以到达从其进行 slice 的数组或 slice 的末尾,因此调用方可以对其进行重新 slice ,使其达到对其进行访问的能力。完整的 slice 表达式使这不可能(或超出某个特定点是不可能的)。

这不是安全措施。程序中的其他代码当然可以弄清楚如何使用unsafe(一种或另一种方式)在片的末尾进行读取或写入。这只是防止意外副作用的一种方法。如果要在您关心的某些数据的中间调用带有 slice 的函数,并且该函数可能将append扩展到 slice 或以其他方式扩展 slice ,则使用完整 slice 表达式来限制容量是明智的做法。

关于go - 完整表示法a [low : high : max]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59677677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com