乐趣区

关于golang:goroutine-顺序执行的技巧

当敞开一个 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)
}
退出移动版