gpt4 book ai didi

Go,将数据传递给 channel

转载 作者:IT王子 更新时间:2023-10-29 01:35:00 25 4
gpt4 key购买 nike

我有一个问题。这是示例: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 中跳出)循环)。

另请注意,单独这样做是行不通的,因为 channel 是无缓冲的,因此 Avg() 将永远被阻塞,试图在 c 上发送一个值而没有人试图从中接收。

如果您创建要缓冲的 channel ,则可以使这个简单的示例起作用:

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

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

test

关于Go,将数据传递给 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48148272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com