Go 语言编程模式实战
陈皓
网名“左耳朵耗子”,资深技术专家
21556 人已学习
免费领取
Go 语言编程模式实战
15
15
1.0x
00:00/00:00
登录|注册

08 | Go编程模式:Pipeline

你好,我是陈皓,网名左耳朵耗子。
这节课,我着重介绍一下 Go 编程中的 Pipeline 模式。对于 Pipeline,用过 Unix/Linux 命令行的人都不会陌生,它是一种把各种命令拼接起来完成一个更强功能的技术方法
现在的流式处理、函数式编程、应用网关对微服务进行简单的 API 编排,其实都是受 Pipeline 这种技术方式的影响。Pipeline 可以很容易地把代码按单一职责的原则拆分成多个高内聚低耦合的小模块,然后轻松地把它们拼装起来,去完成比较复杂的功能。

HTTP 处理

这种 Pipeline 的模式,我在上节课中有过一个示例,我们再复习一下。
上节课,我们有很多 WithServerHead()WithBasicAuth()WithDebugLog()这样的小功能代码,在需要实现某个 HTTP API 的时候,我们就可以很轻松地把它们组织起来。
原来的代码是下面这个样子:
http.HandleFunc("/v1/hello", WithServerHeader(WithAuthCookie(hello)))
http.HandleFunc("/v2/hello", WithServerHeader(WithBasicAuth(hello)))
http.HandleFunc("/v3/hello", WithServerHeader(WithBasicAuth(WithDebugLog(hello))))
通过一个代理函数:
type HttpHandlerDecorator func(http.HandlerFunc) http.HandlerFunc
func Handler(h http.HandlerFunc, decors ...HttpHandlerDecorator) http.HandlerFunc {
for i := range decors {
d := decors[len(decors)-1-i] // iterate in reverse
h = d(h)
}
return h
}
我们就可以移除不断的嵌套,像下面这样使用了:
http.HandleFunc("/v4/hello", Handler(hello,
WithServerHeader, WithBasicAuth, WithDebugLog))

Channel 管理

当然,如果你要写出一个泛型的 Pipeline 框架并不容易,可以使用Go Generation实现,但是,我们别忘了,Go 语言最具特色的 Go Routine 和 Channel 这两个神器完全可以用来构造这种编程。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了Go编程中的Pipeline模式,该模式可以将代码按照单一职责原则拆分成多个高内聚低耦合的小模块,然后轻松地将它们拼装起来,完成复杂的功能。作者首先介绍了HTTP处理中的Pipeline模式,通过代理函数的使用,简化了代码的嵌套结构。接着,作者讲解了如何利用Go语言中的Go Routine和Channel构建Pipeline模式,以及如何使用代理函数来简化函数嵌套。此外,文章还介绍了Fan In/Out的应用,展示了如何通过并发的方式对一个很长的数组中的质数进行求和运算。通过这些示例,读者可以了解到如何利用Pipeline模式和Go语言的特性来简化代码结构,提高代码的可读性和可维护性。文章内容涵盖了流式处理、函数式编程以及并发相关的技术,对于想要深入了解Go编程模式的读者具有一定的参考价值。

该试读文章来自《Go 语言编程模式实战》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • neohope
    第一次调用sum时启动了5个goroutine,然后在merge中等待5个goroutine全部完成。 第二次调用sum就没有用到并发了。而且第二次的goroutine编号,与第一次的没有任何重叠。 虽然是pipeline,其实每次调用都用了不同的goroutine,这和多线程编程是不太一样的。
    2021-03-18
    1
    2
  • docker131313
    pipeline由许多命令组合执行呀
    2024-01-27归属地:北京
  • 不能飞的肥燕
    await是等所有goroute结束再返回,有没有什么方法,我开了多个goroute后,只要一个返回就返回
    2022-05-03
    1
  • py
    这是把数据加了5遍吗?也没看分段求和啊
    2022-01-29
    1
  • 深度复制
    merge的代码里 go func() { wg.Wait() close(out) }() 不太理解wg.Wait()在这里要起一个goroutine.
    2021-02-26
    5
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部