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<-

1 代码片段1

go 利用chan的阻塞机制,实现协程的开始阻塞返回控制器

在选择中支持一种通信(chan)

go的有缓冲chann和无缓冲chan的区别