为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 的“帽子”

Golang 的“帽子”

Go
侃侃无极 2021-12-27 16:01:12
下面的代码:var numbers4 = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}slice := numbers4[4:6:8] fmt.Printf("%d\n", cap(slice))为什么cap(slice)等于4?我以前认为应该是2。
查看完整描述

2 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

numbers4[4:6:8]是一个完整的切片表达式:


对于数组、指向数组的指针或切片a(但不是字符串),主要表达式


a[low : high : max]

构造一个相同类型的切片,并且具有与简单切片表达式相同的长度和元素a[low : high]。此外,它还通过将其设置为 来控制结果切片的容量max - low。


规范说完整的切片表达式控制容量,将其限制为max - low,在您的情况下为8 - 4 = 4。


容量不是切片可以扩展的“额外”元素,容量是切片可以扩展到的最大长度,包括当前长度+超出长度的额外元素。


slice := numbers4[4:6:8]


len(slice) = 6 - 4 = 2

cap(slice) = 8 - 4 = 4


查看完整回答
反对 回复 2021-12-27
?
忽然笑

TA贡献1806条经验 获得超5个赞

容量是底层数组中的元素数(从切片指针引用的元素开始)。

来自Go Slices:用法和内部结构

基本上,它的意思是 cap != len。
因此,切片从 #4 开始,并在 #8 结束,因此, cap 是8 - 4 = 4


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信