golang---channel

0. 参考

1. 目录结构

jeffreyguan@jeguan ~/main$ tree                                                                                                                                                                
.
├── channel
│   └── woker.go
├── go.mod
└── main.go

1 directory, 3 files

2. main.go

package main

import (
	"fmt"
	"main/channel"
)

func main() {
	fmt.Println("Begin...")
	// demo1
	//channel.ChanDemo()

	//	demo2
	channel.ChanDemo2()
}

3. channel.go

package channel

import (
	"fmt"
	"time"
)

// begin: demo1
func ChanDemo() {
	var channels [10]chan int

	for i := 0; i < 10; i++ {
		channels[i] = make(chan int)

		go Worker(i, channels[i])
	}

	for i, c := range channels {
		c <- 'a' + i
	}

	time.Sleep(time.Minute)
}

func Worker(id int, c chan int) {
	for {
		fmt.Printf("Worker %d received %d
", id, <-c)
	}
}

// end: demo1

// begin: demo2
func ChanDemo2() {
	var channels [10]chan<- int

	for i := 0; i < 10; i++ {
		channels[i] = CreateWorker(i)
	}

	for i, c := range channels {
		c <- 'a' + i
	}

	time.Sleep(time.Minute)
}

func CreateWorker(id int) chan<- int {
	c := make(chan int)

	go func() {
		fmt.Printf("Worker %d received %c
", id, <-c)
	}()

	return c
}

// end: demo2

4. 同步

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println("Begin...")

	Done := make(chan bool, 1)
	go SyncWorker(Done)
	<-Done
}

func SyncWorker(done chan<- bool) {
	time.Sleep(time.Second * 2)

	done <- true
}

5. 多个channel同步

package main

import (
	"fmt"
	"sync"
)

func doWork(id int, w worker) {
	for n := range w.in {
		fmt.Printf("Worker %d received %c
", id, n)
		
		w.done()
	}
}

type worker struct {
	in   chan int
	done func()
}

func createWorker(id int, wg *sync.WaitGroup) worker {
	w := worker{
		in:   make(chan int),
		done: func() { wg.Done() },
	}

	go doWork(id, w)

	return w
}

func chanDemo() {
	var wg sync.WaitGroup

	var workers [10]worker
	for i := 0; i < 10; i++ {
		workers[i] = createWorker(i, &wg)
	}

	wg.Add(20)
	for i, worker := range workers {
		worker.in <- 'a' + i
	}
	for i, worker := range workers {
		worker.in <- 'A' + i
	}

	wg.Wait()
}

func main() {
	chanDemo()
}
原文地址:https://www.cnblogs.com/double12gzh/p/12241097.html