当敞开一个channel时,会使得这个channel变得可读。通过这个个性,能够实现一个goroutine执行程序的技巧。
B依赖A, C依赖B

package mainimport (    "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)}