数组移位功能如何与切片一起使用?
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)
}
答案 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:]