本文展示一下如何控制Golang的协程进行顺序执行或者交替执行 1.顺序执行 1package main2 3import (4 "fmt"5 "sync"6)7 8func main() {9 fmt.Println("=====通过 channel 顺序打印=====")10 printOrderlyByChannel()11 fmt.Println("=====通过 WaitGroup 顺序打印=====")12 printOrderlyByWaitGroup()13}14 15// 协程顺序打印 A B C50 collapsed lines16func printOrderlyByChannel() {17 wg := &sync.WaitGroup{}18 wg.Add(3)19 ch := make(chan string)20 ch2 := make(chan string)21 go func () {22 defer wg.Done()23 fmt.Println("A")24 ch <- "B"25 }()26 27 go func () {28 defer wg.Done()29 fmt.Println(<- ch)30 ch2 <- "C"31 }()32 33 go func () {34 defer wg.Done()35 fmt.Println(<- ch2)36 }()37 38 wg.Wait()39}40 41func printOrderlyByWaitGroup() {42 wg := &sync.WaitGroup{}43 44 wg.Add(1)45 go func () {46 fmt.Println("A")47 wg.Done()48 }()49 50 wg.Wait()51 wg.Add(1)52 go func () {53 fmt.Println("B")54 wg.Done()55 }()56 57 wg.Wait()58 wg.Add(1)59 go func () {60 fmt.Println("C")61 wg.Done()62 }()63 64 wg.Wait()65} 2.交替执行 使用两个channel 1func main() {2 wg := &sync.WaitGroup{}3 wg.Add(2)4 chA := make(chan int, 1)5 chB := make(chan int)6 7 chA <- 18 9 go func() {10 defer wg.Done()11 for i := 0; i < 3; i++ {12 <-chA13 fmt.Println(string(rune('a' + i)))14 chB <- 115 }16 collapsed lines16 }()17 18 go func() {19 defer wg.Done()20 for i := 0; i < 3; i++ {21 <-chB22 fmt.Println(i + 1)23 if i == 2 {24 break25 }26 chA <- 127 }28 }()29 30 wg.Wait()31}