首页 > 解决方案 > 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 开始

这是我要去的地方的链接

标签: goslice

解决方案


切片是指底层数组。重新切片切片对底层数组没有影响。

切片表达式中的偏移量(即 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:用法和内部”


推荐阅读