Go,将数据传递给通道

Go, passing data to channel

我有一个问题。这是示例:https://play.golang.org/p/QSWY2INQuSE

func Avg(c chan string, wg *sync.WaitGroup) {
    defer wg.Done()
    c <- "test"
}

func main() {
    var wg sync.WaitGroup
    c := make(chan string)

    timer1 := time.NewTicker(5 * time.Second)

    for {
        select {
        case <-timer1.C:
            wg.Add(1)
            go Avg(c, &wg)
            wg.Wait()
        }
    }
    fmt.Println(<-c)
}

为什么数据达不到fmt.Println(<-c)

谢谢!

因为你有一个无穷无尽的for,所以最后一个fmt.Println()语句永远不会到达。

如果您希望最后一个 fmt.Println() 语句一直执行,则必须跳出循环,例如:

loop:
    for {
        select {
        case <-timer1.C:
            wg.Add(1)
            go Avg(c, &wg)
            wg.Wait()
            break loop
        }
    }
    fmt.Println(<-c)

请注意,您必须使用标签,否则 break 只会跳出 select 语句(而不是跳出 for 循环)。

另请注意,仅此一项是行不通的,因为通道是无缓冲的,因此 Avg() 将永远被阻止,试图在 c 上发送一个值,而没有人尝试发送从中接收。

如果您创建了要缓冲的通道,这个简单的例子就可以工作了:

c := make(chan string, 1) // Buffer for 1 value

现在它可以工作并打印(在 Go Playground 上试试):

test