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

浙公网安备 33010602011771号