很抱歉,如果这看起来非常基本,但为什么我会收到此错误?我没有看到任何切片/阵列超出范围。
package main
import "fmt"
func main(){
s:= [...]int{1,2,3}
rev(s[:])
fmt.Println(s)
}
func rev(input []int) []int {
var j int
l:=len(input)-1
for i:=0; i<l;i++ {
j= input[len(input)-i]
input=append(input, j)
i++
}
return input[:l]
}
由于
答案 0 :(得分:3)
[...]int{1,2,3}
不是切片。这是一个容量阵列3
请参阅&#34; golang-101-hacks: Array&#34;
如果你试图附加第四个元素......那将超出范围。
但是s[:]
transforms it into a slice。
实际的&#39; index out of range
&#39;来自input[len(input)-i]
,其中i=0
表示input[len(input)]
:超出范围。
这会更好(playground)(不超出范围)
最终fmt.Println(s)
仍然打印原始数组,而不是rev()
的返回(被忽略)。
这打印了&#34;期望&#34;结果(使用append,如此变异并添加到切片中):
package main
import "fmt"
func main() {
s := [...]int{1, 2, 3}
t := rev(s[:])
fmt.Println(s)
fmt.Println(t)
}
func rev(input []int) []int {
var j int
l := len(input) - 1
for i := 0; i <= l; i++ {
j = input[l-i]
input = append(input, j)
}
return input
}
结果:
[1 2 3]
[1 2 3 3 2 1]
这(playground)实际上会反转切片:
var j int
var res []int
l := len(input) - 1
for i := 0; i <= l; i++ {
j = input[l-i]
res = append(res, j)
}
return res
结果:
[1 2 3]
[3 2 1]