去,将数据传递给频道

时间:2018-01-08 10:21:06

标签: go concurrency channel goroutine

我有一个问题。以下是示例: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)

谢谢!

1 个答案:

答案 0 :(得分:4)

因为您有无尽的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