在不使用for语句的情况下迭代golang数组/切片

时间:2015-12-17 03:13:30

标签: arrays go

是否可以在golang数组/切片上进行迭代而不使用' for'声明?

5 个答案:

答案 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没有像forwhile这样的循环关键字,它只有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

请注意,虽然它包含所请求的切片,但切片本身的属性将完全未使用。