gpt4 book ai didi

go - 尝试通过 WaitGroup 了解 go func

转载 作者:IT王子 更新时间:2023-10-29 02:32:30 27 4
gpt4 key购买 nike

我有以下代码 https://play.golang.org/p/9jPlypO4d-

package main
import (
"fmt"
"sync"
"time"
)

func main() {
var wg sync.WaitGroup
wg.Add(1)
c := make(chan int)
go func() {
defer wg.Done()
for {
if <-c == -1 {
fmt.Print(":")
return
}

fmt.Print(".")
time.Sleep(time.Second)
}

}()

c <- 0
time.Sleep(time.Second * 5)
c <- -1
wg.Wait()
}

我想知道为什么只有一个 . 打印?不应该是 4 或 5 吗?

最佳答案

if <-c == -1将阻塞,直到 channel 中有东西为止。所以,第一个值是 0,它得到它,打印出 . ,休眠一秒(在 goroutine 之外它休眠 5 秒),然后它阻塞直到它获得下一个值。然后它返回。

读取 channel 而不阻塞(据我所知)的唯一方法是使用带默认大小写的 select 语句。

go func() {
defer wg.Done()
for {
select {
case x, ok := <-c:
if ok && x == -1 {
fmt.Print(":")
return
}
default:
fmt.Print(".")
}

time.Sleep(time.Second)
}

}()

https://play.golang.org/p/nOG_hfih4D

关于go - 尝试通过 WaitGroup 了解 go func,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44556231/

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