在go中slice[:1][0]与slice[0]

r1wp621o  于 2023-11-14  发布在  Go
关注(0)|答案(1)|浏览(128)

在go中的unsafe.SliceData函数的文档中,它说:
SliceData返回一个指向参数slice的底层数组的指针。

  • 如果cap(slice) > 0,则SliceData返回&slice[:1][0]

返回&slice[:1][0]而不是&slice[0]背后的逻辑是什么?据我所知(我的tests确认),两者将返回相同的地址。go开发人员选择使用前者而不是后者有什么具体原因吗?

3qpi33ja

3qpi33ja1#

一个切片可能有正的容量(cap(slice) > 0),但同时它可能有0的长度。像slice[0]一样索引它会导致运行时死机。
如果一个切片有正容量,你可以像slice[:1]一样切片,这将导致一个长度为1的切片,你可以像result[0]一样索引结果,而不会导致运行时死机。
举例来说:

  1. slice := make([]int, 0, 5)
  2. fmt.Println(&slice[0])

字符串
这导致:

  1. panic: runtime error: index out of range [0] with length 0


但这是可行的:

  1. fmt.Println(&slice[:1][0])

展开查看全部

相关问题