工序篇 a year ago
今天封装了库 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
}
- 上一篇: 关于for select case
- 下一篇: golang递归读取file