Golang 流水线设计模式实践示例详解

 更新时间:2023年12月18日 14:08:33   作者:俞凡  
这篇文章主要为大家介绍了Golang 流水线设计模式实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

流水线设计模式

流水线设计模式对于顺序处理业务数据非常有用,可以以一致的方式直观的定义对数据的处理流程。

到目前为止,我已经将 Golang 整合到项目中有一段时间了,Golang 是一种非常强大的语言,我渴望在其生态系统中进一步磨练技能。

基于项目的特定需求,我需要实现流水线模式(Pipeline Pattern),数据需要通过多个过滤器,以顺序的方式进行处理。让我解释一下:

假设我们有一个很长的字符串。第一步是根据特定标准对其进行解析。接下来,需要对解析后的数据进行一些调整。随后,将解析后的数据保存到数据库中。正如你所见,有多个任务需要处理,而每个任务都是相互关联的。

基础流水线

在软件开发中,可以用流水线设计模式(pipeline design pattern) 来管理这种场景,该模式是为顺序处理对象修改而设计的。想象有一条装配流水线,每个工位都是一段"管道(pipe)",当某个物体通过整个流水线后,就发生了变化。从本质上讲,流水线负责将值通过一系列可调用的"管道(pipe)"(无论是中间件、过滤器还是处理器)进行顺序传递。在将该值传递给序列中的后续管道之前,每个管道段都有可能改变该值。该模式在诸如请求处理、数据处理或转换等场景中特别有用,提供了一种干净、可维护和可测试的方法。

作为解决方案,我准备了一个简单的 Golang 包,可以在处理流程中使用流水线模式,它建立在责任链(chain of responsibility, CoR) 设计模式之上,可以将其安装到项目中并使用:

go get github.com/izniburak/pipeline-go

包安装之后,可以做一个简单演示。首先需要一些新的结构体,这些结构体具有从PipeInterface实现的Handle方法。因为 pipeline 包需要多个流水线,所以我们用Handle方法来运行每个流水线:

package main
import (
 "strings"
 "github.com/izniburak/pipeline-go"
)
type UpperCasePipe struct{}
func (u *UpperCasePipe) Handle(value pipeline.PipeValue, next pipeline.PipeNext) pipeline.PipeValue {
  // get value
  text := value.(string)
  capitalized := strings.ToUpper(text)
  return next(capitalized)
}
type TrimSpacePipe struct{}
func (t *TrimSpacePipe) Handle(value pipeline.PipeValue, next pipeline.PipeNext) pipeline.PipeValue {
  // get value
  text := value.(string)
  trimmed := strings.Trim(text, " ")
  return next(trimmed)
}

使用流水线

package main
import (
 "fmt"
 "strings"
 "github.com/izniburak/pipeline-go"
)
type UpperCasePipe struct{}
func (u *UpperCasePipe) Handle(value pipeline.PipeValue, next pipeline.PipeNext) pipeline.PipeValue {
  // get value
  text := value.(string)
  capitalized := strings.ToUpper(text)
  return next(capitalized)
}
type TrimSpacePipe struct{}
func (t *TrimSpacePipe) Handle(value pipeline.PipeValue, next pipeline.PipeNext) pipeline.PipeValue {
  // get value
  text := value.(string)
  trimmed := strings.Trim(text, " ")
  return next(trimmed)
}
func main() {
  text := "   buki.dev   "
  pipes := []pipeline.PipeInterface{
    new(UpperCasePipe),
    new(TrimSpacePipe),
  }
  result := pipeline.Send(text).Through(pipes).ThenReturn()
  fmt.Println(result) // BUKI.DEV
}

如你所见,我们使用了两个不同的管道,分别是UpperCasePipeTrimSpacePipe。输入是 buki.dev ,两边都有空格,输出是BUKI.DEV

就是这样。流水线非常有用,是吧?

可以在 GitHub 上查看 pipeline包

以上就是Golang 流水线设计模式实践示例详解的详细内容,更多关于Golang 流水线设计模式的资料请关注脚本之家其它相关文章!

相关文章

  • Golang实现密码加密的示例详解

    Golang实现密码加密的示例详解

    数据库在存储密码时,不能明文存储,需要加密后存储,而Golang中的加密算法有很多种,下面小编就来通过简单的示例和大家简单聊聊吧
    2023-07-07
  • 如何使用工具自动监测SSL证书有效期并发送提醒邮件

    如何使用工具自动监测SSL证书有效期并发送提醒邮件

    本文介绍了如何开发一个工具,用于每日检测SSL证书剩余有效天数并通过邮件发送提醒,工具基于命令行,通过SMTP协议发送邮件,需配置SMTP连接信息,本文还提供了配置文件样例及代码实现,帮助用户轻松部署和使用该工具
    2024-10-10
  • 如何编写Go语言中间件的实例教程

    如何编写Go语言中间件的实例教程

    不知道大家有没有写过中间件呢,它是怎么写的呢?下面这篇文中就来给大家分享一下使用Go,如何编写中间件,文中通过示例代码介绍的非常详细,供大家参考学习,下面随着小编来一起学习学习吧。
    2018-04-04
  • Golang Makefile示例深入讲解使用

    Golang Makefile示例深入讲解使用

    一次偶然的机会,在 github 上看到有人用 Makefile,就尝试了一下,发现真的非常合适,Makefile 本身就是用来描述依赖的,可读性非常好,而且与强大的 shell 结合在一起,基本可以实现任何想要的功能
    2023-01-01
  • Go 语言结构体链表的基本操作

    Go 语言结构体链表的基本操作

    链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,这篇文章主要介绍了Go 语言结构体链表,需要的朋友可以参考下
    2022-04-04
  • Go处理PDF的实现代码

    Go处理PDF的实现代码

    这篇文章主要介绍了Go处理PDF的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Go语言的os包中常用函数初步归纳

    Go语言的os包中常用函数初步归纳

    这篇文章主要介绍了Go语言的os包中常用函数初步归纳,用于一些和系统交互功能的实现,需要的朋友可以参考下
    2015-10-10
  • Go语言通过TCP协议实现聊天室功能

    Go语言通过TCP协议实现聊天室功能

    这篇文章主要为大家详细介绍了Go语言中如何通过TCP协议实现聊天室功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • GoRoutines高性能同时进行多个Api调用实现

    GoRoutines高性能同时进行多个Api调用实现

    这篇文章主要为大家介绍了GoRoutines高性能同时进行多个Api调用实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Gotify搭建你的消息推送系统

    Gotify搭建你的消息推送系统

    这篇文章主要介绍了Gotify搭建你的消息推送系统,今天要分享的是 gotify,是一个用 go 编写的消息服务端,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2024-01-01

最新评论