当敞开一个 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)
}