Go-zh / tour

【已弃用】新版移至 website 代码仓库
http://tour.go-zh.org
BSD 3-Clause "New" or "Revised" License
1.52k stars 223 forks source link

slice范围取值超过len不会报错 #357

Closed quanhengzhuang closed 5 years ago

quanhengzhuang commented 5 years ago

上下文: https://tour.go-zh.org/moretypes/11

在上一节中 https://tour.go-zh.org/moretypes/10 写道:

切片下界的默认值为 0,上界则是该切片的长度。

但其实只要不超过cap,就不会报错。但这样操作很容易出问题,不知道go为什么不判断一下len。

go ss := []int{1, 2, 3, 4, 5} //此时len=2,cap=4 ss = ss[1:3] printSlice(ss) //4超过了len,但并不会报错 ss = ss[2:4] printSlice(ss) //这次会报错,因为5超过了cap ss = ss[3:5] printSlice(ss)

OlingCat commented 5 years ago

因为你第一次其实是从底层数组上切下来的切片,第二次才是在第一次的切片上再切的。详见 https://golang.org/ref/spec#Slice_types