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

Go 切片长度是容量 -1,为什么?

Go 切片长度是容量 -1,为什么?

Go
心有法竹 2021-10-25 17:16:16
在 shell 中具有特殊含义的字符需要被引用或转义。您可以在 shell 的手册页中找到完整列表(在 中的“引用”下man 1 bash)。在这种情况下,您可以引用或转义 baskslash-string=hello\\Bob// or-string='hello\Bob'
查看完整描述

3 回答

?
忽然笑

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

这一行:

fruits := [4]string{"apple", "orange", "mango"}

创建一个数组,而不是一个切片。即使您只提供了 3 个元素,它也有 4 个元素。输出fmt.Printf("%q", fruits)

["apple" "orange" "mango" ""]

切片:

tasty_fruits := fruits[1:3]

结果是:

["orange" "mango"]

长度:显然 2.容量?

容量是...的片的长度和超过所述切片中的[基本]阵列的长度的总和。

由于"mango"底层数组中有一个元素,因此容量为2 + 1 = 3

索引切片 ( tasty_fruits): 规范:索引表达式

对于a切片类型Sa[x]

  • 如果x在运行时超出范围,则会发生运行时恐慌

x如果在范围内0 <= x < len(a),否则超出范围。由于len(tasty_fruits)is 2,索引2超出范围,因此发生运行时恐慌。

您不能索引超出切片长度的切片,即使容量允许。如果您重新切片,则只能到达超出长度的元素,例如:

tasty_fruits2 := tasty_fruits[:3]
tasty_fruits2[2] = "nectarine" // This is ok, len(tasty_fruits2) = 3
fmt.Printf("%q", tasty_fruits2)

输出:

["orange" "mango" "nectarine"]


查看完整回答
反对 回复 2021-10-25
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

切片的容量取决于底层数组的大小。因此,如果您更改fruits为具有差异大小,例如:

fruits := [5]string{"apple", "orange", "mango"}

cap(tasty_fruits) 将返回 4 而不是 3。

所以容量意味着切片可以扩展到的最大大小。“切片不能超过其容量。尝试这样做会导致运行时恐慌”。

切片本质上是c带有边界检查的指针。切片的长度是它将在运行时检查的边界。因此,如果您尝试访问超出长度的任何内容,也会导致运行时恐慌。

是的,长度 <= 容量总是正确的。


查看完整回答
反对 回复 2021-10-25
  • 3 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

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