go chan 入门代码
Posted lf888
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go chan 入门代码相关的知识,希望对你有一定的参考价值。
package main import ( "fmt" "sync" "time" ) // 生产数据 func producer(num ...int)(ret<-chan int) { out:=make(chan int) go func() { defer close(out) for k,v:=range num { fmt.Printf("我在生产第%d个数据 ",k) out<-v fmt.Printf("生产第%d个数据完成 ",k) } }() ret=out return } // 从通道获取数据,计算数据 func square(inCh <-chan int) (ret <-chan int) { out:=make(chan int) go func() { defer close(out) for n:=range inCh{ out<-n*n time.Sleep(1*time.Second) } }() ret=out return } // 给通道启动协程 func merge(cs ...<-chan int)(ret <-chan int) { out:=make(chan int,100) var wg sync.WaitGroup collect:= func(in<-chan int) { defer wg.Done() for n:=range in{ out<-n } } wg.Add(len(cs)) for k,n:=range cs{ fmt.Printf("我在给执行第%d个协程 ",k) go collect(n) fmt.Printf("执行第%d个协程完成 ",k) } go func() { wg.Wait() close(out) }() ret=out return } func main() { in:=producer(0,1,2,3,4,5,6,7,8,9,10) ch1:=square(in) ch2:=square(in) ch3:=square(in) ch4:=square(in) ch5:=square(in) // 拿到数据结果 for ret:=range merge(ch1,ch2,ch3,ch4,ch5){ time.Sleep(1*time.Second) fmt.Printf("%3d ",ret) } }
以上是关于go chan 入门代码的主要内容,如果未能解决你的问题,请参考以下文章
2022-07-06:以下go语言代码是否会panic?A:会;B:不会。 package main import “C“ func main() { var ch chan struct
2022-09-12:以下go语言代码输出什么?A:true;B:false;C:无法编译;D:运行时 panic。 package main func main() { var x chan<-