我有以下代码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吗?
答案 0 :(得分:3)
if <-c == -1
将阻止,直到频道中有内容为止。所以,第一个值是0,它得到它,打印出一个.
,睡眠一秒钟(在goroutine外面睡觉5秒),然后它阻塞直到它获得下一个值。然后它返回。
读取通道而不阻塞(我知道)的唯一方法是使用带有默认情况的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)
}
}()