当关闭一个channel时,会使得这个channel变得可读。通过这个特性,可以实现一个goroutine执行顺序的技巧。
B依赖A, C依赖B
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
//要使 A->B->C 顺序执行
func main() {
A := make(chan struct{})
B := make(chan struct{})
C := make(chan struct{})
wg.Add(3)
go func() {
defer wg.Done()
testA(A, B)
}()
go func() {
defer wg.Done()
testB(B, C)
}()
go func() {
defer wg.Done()
testC(C)
}()
close(A)
wg.Wait()
time.Sleep(10 * time.Second)
}
func testA(A chan struct{}, B chan struct{}) {
<-A
fmt.Println(1)
close(B)
}
func testB(B chan struct{}, C chan struct{}) {
<-B
fmt.Println(2)
close(C)
}
func testC(C chan struct{}) {
<-C
fmt.Println(3)
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。