Golang: 三个goroutines轮流打印1-20之内的数字

用channels来协调goroutines之间的运行顺序

package main

import (
	"fmt"
	"sync"
)

var limit = 20
var wg sync.WaitGroup
var done chan string = make(chan string)

func main() {
	c1, c2, c3 := make(chan string), make(chan string), make(chan string)
	num := 1
	for i := 0; i < 3; i++ {
		wg.Add(1)
		if i == 0 {
			go print(i+1, &num, c3, c1)
		} else if i == 1 {
			go print(i+1, &num, c1, c2)
		} else {
			go print(i+1, &num, c2, c3)
		}
	}
	c3 <- "hello"
	wg.Wait()
}

func print(id int, num *int, inChan <-chan string, outChan chan<- string) {
	defer wg.Done()
	for {
		select {
		case <-inChan:
			fmt.Printf("goroutine id %d prints %d\n", id, *num)
			(*num)++
			if (*num) == limit+1 {
				close(done)
				return
			}
			outChan <- "hello"
		case <-done:
			return
		}
	}
}

你可能感兴趣的:(golang,开发语言,后端)