go - GoLang Slice 默认上下界混淆
问题描述
package main
import "fmt"
func main() {
s := []int{2, 3, 5, 7, 11, 13}
s=s[0:4]
fmt.Println(s) // 1st
s = s[1:4]
fmt.Println(s) // 2nd
s = s[:2]
fmt.Println(s) //3rd
s = s[1:]
fmt.Println(s) // 4th
s= s[:]
fmt.Println(s) // 5th
s=s[0:4]
fmt.Println(s) // 6th
}
我得到的输出是这个
[2 3 5 7]
[3 5 7]
[3 5]
[5]
[5]
[5 7 11 13]
为什么在第三个输出只有 3 5 为什么不是 2 3
假设如果每次切片减少时我都通过这个逻辑,那么:为什么最后一行有 5 7 11 13。
如果假设上述逻辑是错误的,那么:为什么最后一行有输出 [5 7 11 13] 为什么不从 2 开始
解决方案
切片是指底层数组。重新切片切片对底层数组没有影响。
切片表达式中的偏移量(即 0 in [0:4]
)是指切片的开始,而不是数组的开始。因此,在切出数组后,您不能“返回”到数组的早期值。为此,您必须保留较早的切片值。
下面是可以通过切片“看到”的底层数组(用方括号表示)的哪一部分(用花括号表示)的进程:
initial: [{2, 3, 5 , 7, 11, 13}]
s=s[0:4]: [{2, 3, 5 , 7}, 11, 13 ]
s=s[1:4]: [ 2, {3, 5 , 7}, 11, 13 ]
s=s[:2]: [ 2, {3, 5}, 7, 11, 13 ]
s=s[1:]: [ 2, 3, {5}, 7, 11, 13 ]
s=s[:]: [ 2, 3, {5}, 7, 11, 13 ] // no-op
s=s[0:4]: [ 2, 3, {5 , 7, 11, 13}]
请注意数组如何保持不变,并且左大括号仅向右移动(如果有的话)。
有关更多详细信息,请参阅“Go Slices:用法和内部”。
推荐阅读
- jmeter - 我在 Jmeter 中添加了堆大小,但仍然出现 OOM 错误
- r - 启动新的 RSelenium 服务器时出错
- java - 如何将 gradle 指向可以具有不同路径的本地依赖项?
- python - 单击按钮 FLASK 时显示通知
- javascript - 我怎样才能返回假?
- javascript - 从获取的数据中显示一个属性 React native
- python-3.x - 使用 win32wnet 导入时使用 cx_freeze 编译后的 DLL 问题
- java - 将 XML 解析为 TextView:android
- here-api - 如何将 POI 添加到 Here Maps
- java - 如何转换单声道
- > 到另一个单声道
- >?