Slice Expression#

Spec

https://go.dev/ref/spec#Slice_expressions

备注

  • Slice expr 只是创建「数据的视图」,不会开辟新空间

  • 和 Python 不同,Go 的 slice expr 会导致 out of range panic, 但对于 low 和 high 来说 “range” 的定义是不同的

Out of Range#

low 和 high 的取值范围如下,超出返回会导致 panic:

low

[0, len)

high

[0, cap)

	s := make([]int, 1, 5)

	// 0 <= low < len(s)
	_ = s[0:] // ✅ OK
	_ = s[1:] // ✅ OK
	// _ = s[2:] // ⚠️  PANIC

	// 0 <= high < cap(s)
	_ = s[:0] // ✅ OK
	_ = s[:2] // ✅ OK
	_ = s[:5] // ✅ OK
	// _ = s[:6] // ⚠️  PANIC

Extend Capacity#

利用 high 的取值范围可以将 slice 长度扩张到其容量上限:

s = s[:cap(s)]
	s1 := make([]int, 1, 5)
	s2 := s1[:cap(s1)]

	// [len/cap]addr
	println(s1) // [1/5]0xc000048748
	println(s2) // [5/5]0xc000048748
评论

如果你有任何意见,请在此评论。 如果你留下了电子邮箱,我可能会通过 回复你。