旺仔小糖

工序篇 a year ago

go
1850个字符
共有109人围观

博客大纲

今天封装了库 channel

用于处理与channel相关的事情, 映射到现实就是一道工序

  • channel merge
  • channel from one to another

api

  • func C2C[K, V any](in <-chan K, exchange func(K) V) <-chan V: receive one channel and return another; exchange: change K instance to V instance,用于pipeline及扇入扇出情景
  • func C2CNM[K, V any](in <-chan K, exchange func(K) V, n int) <-chan V: merge multiple channels into one channel,用于扇入扇出情景

example

package main

import (
	"fmt"
	"github.com/scott-x/channel"
)

func assemble(k string) string {
	return "组装(" + k + ")"
}

func pack(k string) string {
	return "打包(" + k + ")"
}

func main() {
	coms := buy(15) //采购15套配件
	//3班人同时组装15部手机
	phones1 := channel.C2C[string, string](coms, assemble)
	phones2 := channel.C2C[string, string](coms, assemble)
	phones3 := channel.C2C[string, string](coms, assemble)
	//汇聚3个channel成1个
	phones := channel.Merge[string](phones1, phones2, phones3) //打包他们以便售卖

	packs := channel.C2C[string, string](phones, pack)
	for p := range packs {
		fmt.Println(p)
	}
}

// 工序1:采购
func buy(n int) <-chan string {
	out := make(chan string)
	go func() {
		defer close(out)
		for i := 0; i < n; i++ {
			out <- fmt.Sprintf("配件%d", i)
		}
	}()
	return out
}

运行3次,看看效果:

上面的代码和下面的等效:

package main

import (
	"fmt"
	"github.com/scott-x/channel"
)

func assemble(k string) string {
	return "组装(" + k + ")"
}

func pack(k string) string {
	return "打包(" + k + ")"
}

func main() {
	coms := buy(15) //采购15套配件
	//3班人同时组装15部手机
	phones := channel.C2CNM(coms, assemble, 3)
	//打包
	packs := channel.C2C[string, string](phones, pack)
	for p := range packs {
		fmt.Println(p)
	}
}

// 工序1:采购
func buy(n int) <-chan string {
	out := make(chan string)
	go func() {
		defer close(out)
		for i := 0; i < n; i++ {
			out <- fmt.Sprintf("配件%d", i)
		}
	}()
	return out
}