提问人:aviro 提问时间:11/2/2023 更新时间:11/2/2023 访问量:64
Go 中的 slice[:1][0] 与 slice[0]
slice[:1][0] vs slice[0] in go
问:
在不安全的文档中。Go 中的 SliceData 函数,它说:
SliceData
返回指向参数的基础数组的指针 片。
- 如果> 0,则返回 。
cap(slice)
SliceData
&slice[:1][0]
返回而不是返回背后的逻辑是什么?据我所知(我的测试证实),两者都会返回相同的地址。Go 开发人员选择使用前者而不是后者是否有具体原因?&slice[:1][0]
&slice[0]
答:
6赞
icza
11/2/2023
#1
切片可能具有正容量 (),但它可能同时具有长度。像这样索引它会导致运行时崩溃。cap(slice) > 0
0
slice[0]
如果切片具有正容量,则可以像这样对其进行切片,这将导致长度为 的切片,并且您可以像这样索引结果,而不会导致运行时崩溃。slice[:1]
1
result[0]
例如:
slice := make([]int, 0, 5)
fmt.Println(&slice[0])
这导致:
panic: runtime error: index out of range [0] with length 0
但这有效:
fmt.Println(&slice[:1][0])
评论
0赞
aviro
11/2/2023
所以只是为了确保我理解:当您访问长度为零且容量为 0 的切片时>,它将返回一个长度为 1(值为零)的新切片?但是原始(零长度)切片和新切片()的基础地址会相同吗?slice[:1]
result[:1][0]
1赞
icza
11/2/2023
@aviro 切片是后备数组中连续部分的描述符。对切片进行切片会返回一个共享后备数组的新分解器。长度决定了您可以索引哪个部分。如果 length=0 将禁用对元素的访问。但是你可以用更大的长度(最多到容量)重新切片,这将允许你访问元素(索引将变得有效)。阅读博客文章:go.dev/blog/slices-intro 和 go.dev/blog/slices
评论