一尘不染

为什么去允许从len(slice)切片?

go

为什么会发生以下现象:

a := []int{1, 2, 3}
fmt.Println(a[0:])
fmt.Println(a[1:])
fmt.Println(a[2:])
fmt.Println(a[3:])// doesn't panic - why??
fmt.Println(a[4:])// panics as expected

可执行示例


阅读 200

收藏
2020-07-02

共1个答案

一尘不染

a[3:] 构建一个空切片,就像一个空数组一样,它是一个有效且有用的对象(在所有语言中,而不仅仅是在Go中)。

空切片还仍然指向基础数组,位置和容量,有时可以扩展:

a := []int{1, 2, 3}
emptySlice := a[1:1]
fmt.Println(emptySlice) // []
notEmpty := emptySlice[0:2]
fmt.Println(notEmpty)   // [2 3]

另一方面,长度为负的切片不一致。它没有任何意义,因此被禁止。

2020-07-02