GoLang切片默认下限和上限混淆

GoLang切片默认下限和上限混淆,go,slice,Go,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

我最讨厌的是这个

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 
}
为什么在第三出 只有35为什么不是23

假设我要通过这个逻辑 每次切片都会减少,然后: 为什么最后一行有5 7 11 13

如果假设上述逻辑是错误的,那么 :为什么最后一行有输出[5 7 11 13]为什么不从2开始


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

切片表达式中的偏移量(即
[0:4]
中的0)指的是切片的起点,而不是数组的起点。因此,在切掉数组的早期值后,不能“返回”到这些值。要做到这一点,您必须保留一个较早的切片值

下面是通过切片(用大括号表示)可以“看到”底层数组的哪个部分(用方括号表示)的过程:

请注意数组如何保持不变,左大括号仅向右移动(如果有)

有关更多详细信息,请参阅

[2 3 5 7]
[3 5 7]
[3 5]
[5]
[5]
[5 7 11 13]

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}]