切片移位就像go lang中的功能一样

时间:2017-03-11 00:46:46

标签: go slice shift

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

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

我从切片技巧中找到了一个例子,但无法做到正确。

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

2 个答案:

答案 0 :(得分:0)

例如,

→ docker history openjdk:8-jre-alpine
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
d85b17c6762e        2 months ago        /bin/sh -c set -x  && apk add --no-cache  ...   103 MB              
<missing>           2 months ago        /bin/sh -c #(nop)  ENV JAVA_ALPINE_VERSION...   0 B                 
<missing>           2 months ago        /bin/sh -c #(nop)  ENV JAVA_VERSION=8u111       0 B                 
<missing>           2 months ago        /bin/sh -c #(nop)  ENV PATH=/usr/local/sbi...   0 B                 
<missing>           2 months ago        /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/lib/...   0 B                 
<missing>           2 months ago        /bin/sh -c {   echo '#!/bin/sh';   echo 's...   87 B                
<missing>           2 months ago        /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0 B                 
<missing>           2 months ago        /bin/sh -c #(nop) ADD file:eeed5f514a35d18...   4.8 MB              

输出:

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

参考文献:

The Go Programming Language Specification: For statements

回答编辑问题的附录:

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

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

答案 1 :(得分:0)

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

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

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

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

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

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

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

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

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