go slice

这一段时间在学习golang
看到slice这个地方有一些不是特别明白

func main() {
    array := [5]int{0, 1, 2, 3, 4}
    slice1 := array[5:]
    slice2 := array[6:]
    fmt.Println(slice1, slice2)
}

为什么第一个去的slice的成功了
第二个却失败了呢
是什么原因呢??

阅读 3.5k
4 个回答

slice 或者(array) 中 [x:y] 的取值范围就是:0≤x≤y≤len(slice/array)
这是由 golang 的语法规定的

很明显 array里面只有五个成员 slice的语法不是从0开始计算的

看到这个问题,我觉得两个都应该报错,但实验了一下,发现结果却是题主所描述的那样,所以只能从结果去推测了。

比较认同 @linuxr 说的:slice 或者(array) 中 [x:y] 的取值范围就是:0≤x≤y≤len(slice/array),是由 golang 的语法规定的。

因为 slice 操作 slice[n:m],实际取值是: [n,m) 这些元素,所以如果要取n下标之后的所有元素,有两种做法: [n:][n:len(slice)], 这意味着 : 右边的值必须能填 len(slice) 的大小。

但是,个人觉得 : 左边的值却没有这个必要,也就是上面的例子中第一个 array[5:] ,比较好的做法应该是报错而不是返回0个元素的slice.

slice2 := array[6:]
array[6:] 数组越界了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题