Concurrency 理解代码执行并发模式:菊花链

Concurrency 理解代码执行并发模式:菊花链,concurrency,go,Concurrency,Go,我在研究Go并发模式 我不确定的一种模式是:菊花链 我很难理解代码的控制流 有人能给我解释一下吗 package main import ( "fmt" ) func f(left, right chan int) { left <- 1 + <-right } func main() { const n = 10000 leftmost := make(chan int) right := leftmost

我在研究Go并发模式

我不确定的一种模式是:菊花链

我很难理解代码的控制流

有人能给我解释一下吗

package main

import (
    "fmt"
)

func f(left, right chan int) {
    left <- 1 + <-right
}

func main() {
    const n = 10000

    leftmost := make(chan int)
    right := leftmost               //point B: what does these do ?
    left := leftmost

    for i := 0; i < n; i++ {
        right = make(chan int)
        go f(left, right)
        left = right                //point A
    }
    go func(c chan int) { c <- 1 }(right)  
    fmt.Println(<-leftmost)
}
主程序包
进口(
“fmt”
)
函数f(左、右循环整数){

左它说明您可以生成大量goroutine


这里,每个
go f(左、右)
块:
leftVonC已经给出了一个直接的答案。下面是一些进一步的说明


这里有一个稍微整理过的版本,不同之处在于作为参数传递的通道有明确指定的方向,即,
我不确定A点和B点中的代码。这些语法真的让我困惑。你介意解释一下吗?我喜欢数组方法。+1是的,它很容易理解,但很好要知道数组不是严格必需的(根据原始程序),这样可以节省一些内存。内存不足比代码清晰更重要吗?(始终是一个有用的问题-没有始终正确的答案)您的版本看起来不错。您应该将其作为答案发布。
var right chan int
 left <- (new) right (now left) <- (new) right (now left) <- ...
package main

import (
    "fmt"
)

func f(left chan<- int, right <-chan int) {
    left <- 1 + <-right
}

func main() {
    const n = 10000

    // first we construct an array of n+1 channels each being a 'chan int'
    var channels [n+1]chan int
    for i := range channels {
        channels[i] = make(chan int)
    }

    // now we wire n goroutines in a chain
    for i := 0; i < n; i++ {
        go f(channels[i], channels[i+1])
    }

    // insert a value into the right-hand end
    go func(c chan<- int) { c <- 1 }(channels[n])

    // pick up the value emerging from the left-hand end
    fmt.Println(<-channels[0])
}