左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家
180940 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 119 讲
左耳听风
15
15
1.0x
00:00/00:00
登录|注册

114 | Go编程模式:Pipeline

sum()
odd()
sq()
echo()
merge()
prime()
示例
代理函数
用户端代码示例
Channel转发函数
代理函数
代码示例
参考文档
Fan in/Out
Channel管理
HTTP处理
Go编程模式:Pipeline

该思维导图由 AI 生成,仅供参考

你好,我是陈皓,网名左耳朵耗子。
这节课,我着重介绍一下 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模式是一种将各种功能代码拼接起来以完成更强大功能的技术方法。文章介绍了在Go编程中如何利用Pipeline模式进行HTTP处理和Channel管理。通过示例展示了如何使用代理函数和Channel转发函数构建Pipeline,以及如何利用Go Routine和Channel实现Fan in/Out。文章还提供了相关资源推荐,为读者进一步了解并发相关技术提供了指引。通过这些内容,读者可以快速了解Go编程中的Pipeline模式及其在并发编程中的应用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • Geek_Fantasy
    判断一个数是否是质数的方法可以优化一下。只需要枚举到value的平方根就可以,可以把复杂度从O(n)降到O(sqrt(n))。
    2021-01-20
    5
  • ano
    merge 中的 wg.Wait() 为什么必须要放到一个单独的 goroutine 中呢?
    2022-09-03归属地:北京
  • Geek_ce6971
    pipeline 最后返回 <- chan 类型,就像 java stream编程的输出流
    2022-01-29
  • 方勇(gopher)
    Pipeline使用场景还是很多的,在做任务发布的时候会经常用到
    2021-12-27
  • 你为啥那么牛
    没看明白 你是怎么分组的
    2021-08-16
    1
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部