文章目录
用goroutine交替输出abc和123
- 使用两个无缓冲 channel 来实现 goroutine 之间的交替通知。
- 一个 channel 控制字母 goroutine,另一个 channel 控制数字 goroutine。
- 每个 goroutine 在输出前先阻塞等待自己的 channel,输出完成后再向另一个 channel 发送信号,把执行权交给对方。
- 主 goroutine 先向字母 channel 发送一个初始信号,从而启动整个交替流程。
- 由于无缓冲 channel 的发送和接收具有同步阻塞特性,所以可以保证两个 goroutine 严格按照
a1b2c3的顺序输出。
go
package main
import (
"fmt"
"sync"
)
func main() {
letters := []rune("abc")
numbers := []rune("123")
letterCh := make(chan struct{})
numberCh := make(chan struct{})
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
for i, ch := range letters {
<-letterCh
fmt.Print(string(ch))
if i < len(numbers) {
numberCh <- struct{}{}
}
}
}()
go func() {
defer wg.Done()
for i, ch := range numbers {
<-numberCh
fmt.Print(string(ch))
if i+1 < len(letters) {
letterCh <- struct{}{}
}
}
}()
letterCh <- struct{}{}
wg.Wait()
fmt.Println()
}