[go]常见的并发模型[泛型版]

本文基于《Go语言并发之道》进行总结,探讨Go语言中常见的并发模型,并简单介绍泛型的使用场景。建议参考官方教程,理解泛型在避免重复代码时的作用。
摘要由CSDN通过智能技术生成

总结于《go语言并发之道》

package common

import "sync"

// Bridge 通过接受传输chan的chan,将值传递给给回去(这个是按顺序读完一个channel才会选择下一个channel)
func Bridge(done <-chan interface{
   }, chanStream <-chan <-chan any) <-chan any {
   
	valStream := make(chan any)
	go func() {
   
		defer close(valStream)
		for {
   
			var stream <-chan any
			select {
   
			case mybeStream, ok := <-chanStream: //读取chanStream中的channel
				if !ok {
   
					return
				}
				stream = mybeStream
			case <-done:
				return
			}
			for val := range OrDone(done, stream) {
    //读取channel内容发送回去
				select {
   
				case <-done:
					return
				case valStream <- val:
				}
			}
		}
	}()
	return valStream
}

// Tee 读取in数据并同时发送给两个接受的channel
func Tee(done <-chan interface{
   }, in <-chan any) (_, _ <-chan any) {
   
	out1 := make(chan any)
	out2 := make(chan any)
	go func() {
   
		defer close(out1)
		defer close(out2)
		for v := range OrDone(done, in) {
   
			var out1, out2 = out1, out2 //本地版本,隐藏外界变量
			for i := 0; i < 2; i++ {
       //为了确保两个channel都可以被写入我们使用两次写入
		
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值