Go并发之Channel的简单示例

编号1,2,3,4 的goroutine  每秒顺序打印 1,2,3,4 的编号
package main

import (
	"fmt"
	"time"
)

//编号1,2,3,4 的goroutine  每秒顺序打印 1,2,3,4 的编号


type Token struct {

}

func worker(id int,ch chan Token,nextChan chan Token){
	for{
		token := <- ch
		fmt.Printf("%d goroutine!\n",id+1)
		time.Sleep(time.Second*1)
		nextChan <- token
	}
}


func main() {
	chans := []chan Token{make(chan Token),make(chan Token),make(chan Token),make(chan Token)}

	for i := 0;i<4;i++{
		go worker(i,chans[i],chans[(i+1)%4])
	}
	chans[0]<- struct{}{}

	//select 用来阻塞main函数
	select {

	}
}

  

 

简单的练习代码

package main

import (
	"fmt"
	"sync"
)

//channel的练习

//两个goroutine 去处理channel

var wg sync.WaitGroup

func add(ch chan int)  {
	defer wg.Done()
	defer close(ch)
	for i :=0;i<10;i++{
		ch <-i
	}
}

func put(ch1 ,ch2 chan int)  {
	defer wg.Done()
	defer close(ch2)
	for{
		tmp,ok := <-ch1
		if !ok{
			break
		}
		ch2 <- tmp*tmp
	}
}

func main() {
	ch1 := make(chan int)
	ch2 := make(chan int)

	wg.Add(2)
	go add(ch1)
	go put(ch1,ch2)

	for val := range ch2{
		fmt.Println(val)
	}
	wg.Wait()

}

  

posted @ 2021-01-22 12:55  pebblecome  阅读(102)  评论(0)    收藏  举报