go lang 中的切片移位函数

slice shift like function in go lang

数组移位函数如何与切片一起使用?

package main

import "fmt"

func main() {
    s := []int{2, 3, 5, 7, 11, 13}

    for k, v := range s {
        x, a := s[0], s[1:] // get and remove the 0 index element from slice
        fmt.Println(a) // print 0 index element
    }
}

我从 slice tricks 中找到了一个例子,但没弄对。

https://github.com/golang/go/wiki/SliceTricks

x, a := a[0], a[1:]

编辑 你能解释一下为什么 x 在这里未定义吗?

基于答案并与 SliceTricks 合并

import "fmt"

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    fmt.Println(len(s), s)
    for len(s) > 0 {
    x, s = s[0], s[1:] // undefined: x
        fmt.Println(x) // undefined: x
    }
    fmt.Println(len(s), s)
}

例如,

package main

import "fmt"

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    fmt.Println(len(s), s)
    for len(s) > 0 {
        x := s[0]      // get the 0 index element from slice
        s = s[1:]      // remove the 0 index element from slice
        fmt.Println(x) // print 0 index element
    }
    fmt.Println(len(s), s)
}

输出:

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

参考文献:

The Go Programming Language Specification: For statements


回答编辑问题的附录:

声明x,

package main

import "fmt"

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    fmt.Println(len(s), s)
    for len(s) > 0 {
        var x int
        x, s = s[0], s[1:]
        fmt.Println(x)
    }
    fmt.Println(len(s), s)
}

输出:

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

您可以为任何切片类型复制和粘贴我的代码;它推断 x 的类型。如果 s 的类型发生变化,则不必更改。

for len(s) > 0 {
    x := s[0]      // get the 0 index element from slice
    s = s[1:]      // remove the 0 index element from slice
    fmt.Println(x) // print 0 index element
}

对于您的版本,x 的类型是显式的,如果 s 的类型发生变化,则必须进行更改。

for len(s) > 0 {
    var x int
    x, s = s[0], s[1:]
    fmt.Println(x)
}

简单解释一下我们如何实现类似 shift 的 Go 功能。这实际上是一个非常手动的过程。举个例子:

catSounds := []string{"meow", "purr", "schnurr"}

firstValue := stuff[0] // meow
catSounds = catSounds[1:]

在第一行,我们创建切片。

在第二行我们得到切片的第一个元素。

在第三行,我们将 catSounds 的值重新分配给当前在第一个元素 (catSounds[1:]) 之后 catSounds 中的所有内容。

考虑到所有这些,为了简洁起见,我们可以用逗号压缩第二行和第三行:

catSounds := []string{"meow", "purr", "schnurr"}

firstValue, catSounds := catSounds[0], catSounds[1:]