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

切片 - 结束时不要恐慌

切片 - 结束时不要恐慌

Go
守着星空守着你 2023-05-08 15:01:12
为什么这段代码有效?具体来说,引用切片范围 a[5:] 并返回零长度切片的行?长度和容量都报告为 5,但引用第六个不存在的元素不会引起恐慌:package mainimport (    "fmt")func main() {    a := []int{1, 2, 3, 4, 5}    fmt.Println(a, "Len(a)=", len(a), "Cap(a)=", cap(a))    fmt.Println(a[4]) // Works as expected    // fmt.Println(a[5]) // XXX-runtime error:index out of range    fmt.Println(a[5:]) // Works--returns a zero-length slice--but why?    a = append(a[:4], a[5:]...)    fmt.Println(a, "Len(a)=", len(a), "Cap(a)=", cap(a))}去游乐场:https://play.golang.org/p/7evt4Y0ADD3在Go Slice - [:n] 和 [n:] 之间的区别解释是底层数组实际上比切片长,所以访问范围 a[5:] 只是访问更长的数组。但是,当您运行这段代码时,您会看到切片的长度和容量实际上报告为 5。如果您取消对 a[5] 的引用的注释,您会发现这确实会导致预期的恐慌。我可以指望这种行为,还是我遇到了可以在未来版本中修复的规范/编译器错误?
查看完整描述

1 回答

?
慕哥9229398

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

这是预期的行为;slice[cap(slice):]指的是 末尾的零长度切片slice。根据规范:

对于数组或字符串,如果 0 <= low <= high <= len(a),则索引在范围内,否则它们超出范围。对于切片,索引上限是切片容量 cap(a) 而不是长度。

注意是<= len(a),不是< len(a);根据规范,允许使用等于长度/容量的索引。


查看完整回答
反对 回复 2023-05-08
  • 1 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

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