如何实现采用深度参数的嵌套迭代器。当深度= 1时,将是一个简单的迭代器。它是一个简单的迭代器,其运行方式类似于简单的for循环。

func Iter () chan int {
    ch := make(chan int);
    go func () {
        for i := 1; i < 60; i++ {
            ch <- i
        }
        close(ch)
    } ();
    return ch
}

输出为1,2,3...59
对于深度= 2,输出将为"1,1" "1,2" ... "1,59" "2,1" ... "59,59"
对于深度= 3,输出将为"1,1,1" ... "59,59,59

我想避免嵌套的for循环。这里有什么解决方案?

最佳答案

我不知道是否有可能避免嵌套循环,但是一种解决方案是使用 channel 管道。例如:

const ITER_N = 60

// ----------------

func _goFunc1(out chan string) {
    for i := 1; i < ITER_N; i++ {
        out <- fmt.Sprintf("%d", i)
    }
    close(out)
}

func _goFuncN(in chan string, out chan string) {
    for j := range in {
        for i := 1; i < ITER_N; i++ {
            out <- fmt.Sprintf("%s,%d", j, i)
        }
    }
    close(out)
}

// ----------------

// create the pipeline
func IterDepth(d int) chan string {
    c1 := make(chan string)
    go _goFunc1(c1)

    var c2 chan string
    for ; d > 1; d-- {
        c2 = make(chan string)
        go _goFuncN(c1, c2)
        c1 = c2

    }
    return c1
}

您可以使用以下方法进行测试:
func main() {
    c := IterDepth(2)

    for i := range c {
        fmt.Println(i)
    }
}

关于go - 编写深度为d的嵌套迭代器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35547964/

10-13 00:13