登录
首页 >  Golang >  Go问答

完整切片符号 a 的用处?

来源:stackoverflow

时间:2024-04-17 22:36:35 191浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《完整切片符号 a 的用处?》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

通过使用完整切片符号 b = 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

请注意,此类副本并不明显,需要添加注释才能让读者看到。

还有其他有用的应用程序吗?


解决方案


它确实强制追加副本,但它的作用稍微比这更通用。如果您使用它,您可以将切片传递给某些未知的代码段,并且知道该代码将无法使用切片来读取或写入比您想要的更多的底层数组。

通过普通切片表达式创建的切片将具有足够的容量,可以到达从中进行切片的数组或切片的末尾,因此调用者可以将其重新切片至其容量以获取对这些项目的访问权限。完整的切片表达式使得这成为不可能(或者超过某个点就不可能)。

这不是一项安全措施。程序中的其他代码当然可以通过某种方式弄清楚如何使用 unsafe 读取或写入超出切片末尾的内容。这只是防止意外副作用的一种方法。如果您在您关心的某些数据的中间调用一个带有切片的函数,并且该函数可能 append 或以其他方式扩展该切片,那么使用完整切片表达式来限制容量是明智的做法。 /p>

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>