文章目录
go
package main
import (
"fmt"
"sync"
)
// 帮忙统计有多少个 goroutine 需要等待,以及什么时候它们都结束了。
var wg sync.WaitGroup
func printer(ch chan int) {
for i := range ch {
fmt.Printf("Received %d ", i)
}
// wg.Done() 表示:这个 goroutine 已经执行完它的任务了。
// 内部等价于 wg.Add(-1):
// 把 WaitGroup 的计数减 1。
// 当计数变成 0 时,任何 wg.Wait() 正在阻塞的 goroutine 都会被唤醒
wg.Done()
}
// main is the entry point for the program.
func main() {
// 创建了一个 无缓冲(unbuffered) 的 channel,类型为 chan int。
// 无缓冲的意思是:
// 发送 c <- i 会阻塞,直到有另外一个 goroutine 正在从 c 读数据;
// 接收 <-c 也会阻塞,直到有别人发送。
c := make(chan int)
// "我有 1 个 goroutine 要等"。
wg.Add(1)
go printer(c)
// Send 10 integers on the channel.
// 阻塞行为:因为 c 是一个无缓冲通道,所以每次主函数发送数据时,都会被阻塞,直到有另一个 goroutine 从该通道中接收数据。如果没有 goroutine 在接收通道中的数据,主 goroutine 会停在那里,等待 printer goroutine 来接收数据。
for i := 1; i <= 10; i++ {
c <- i
}
close(c)
wg.Wait()
fmt.Println()
}
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!