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)
}

你可能感兴趣的:(golang)