是否可以在golang数组/切片上进行迭代而不使用' for'声明?
答案 0 :(得分:4)
您可以使用goto
声明(不推荐)。
package main
import (
"fmt"
)
func main() {
my_slice := []string {"a", "b", "c", "d"}
index := 0
back:
if index < len(my_slice) {
fmt.Println(my_slice[index])
index += 1
goto back
}
}
答案 1 :(得分:1)
您可以编写一个递归函数来迭代切片,但为什么不想使用for
循环?
答案 2 :(得分:0)
Go没有像for
或while
这样的循环关键字,它只有for
,它具有几种不同的形式
答案 3 :(得分:0)
如@LeoCorrea所述,您可以使用递归函数在切片上进行迭代。尾递归可以防止@vutran提到的堆栈溢出。
package main
import "fmt"
func num(a []string, i int) {
if i >= len(a) {
return
} else {
fmt.Println(i, a[i]) //0 a 1 b 2 c
i += 1
num(a, i) //tail recursion
}
}
func main() {
a := []string{"a", "b", "c"}
i := 0
num(a, i)
}
一个可能更具可读性但不太纯净的示例可以使用匿名函数。参见https://play.golang.org/p/Qen6BKviWuE。
答案 4 :(得分:-2)
我也不明白你为什么要这样做,但这里是一个不使用for
循环的代码示例。
package main
import "fmt"
type P struct {
Next *P
}
func (p *P) Iterate() *P {
if p.Next != nil {
fmt.Println("Saw another P")
return p.Next.Iterate()
}
return nil
}
func main() {
var z []*P
z = append(z, &P{})
z = append(z, &P{Next: z[len(z)-1]})
z = append(z, &P{Next: z[len(z)-1]})
z = append(z, &P{Next: z[len(z)-1]})
z = append(z, &P{Next: z[len(z)-1]})
z[len(z)-1].Iterate()
}
https://play.golang.org/p/CMSp6M00kR
请注意,虽然它包含所请求的切片,但切片本身的属性将完全未使用。