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 流水线设计模式的资料请关注脚本之家其它相关文章!

相关文章

  • go实现base64编码的四种方式

    go实现base64编码的四种方式

    本文主要介绍了go实现base64编码的四种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Golang搭建grpc环境的流程步骤

    Golang搭建grpc环境的流程步骤

    这篇文章主要给大家介绍了Golang搭建grpc环境的流程步骤,文中通过图文结合的方式给大家讲解的非常详细,对大家了解Golang搭建grpc环境有一定的帮助,需要的朋友可以参考下
    2024-03-03
  • golang生成vcf通讯录格式文件详情

    golang生成vcf通讯录格式文件详情

    这篇文章主要介绍了golang生成vcf通讯录格式文件详情,​VCF是通讯录格式文件,一般需要用手机通讯录导入导出的文件格式都是vcf格式。​下面详细内容介绍需要的小伙伴可以参考一下
    2022-03-03
  • golang中json反序列化可能遇到的问题

    golang中json反序列化可能遇到的问题

    这篇文章主要给大家介绍了关于golang中json反序列化可能遇到的问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • Go并发与锁的两种方式该如何提效详解

    Go并发与锁的两种方式该如何提效详解

    如果没有锁,在我们的项目中,可能会存在多个goroutine同时操作一个资源(临界区),这种情况会发生竞态问题(数据竞态),下面这篇文章主要给大家介绍了关于Go并发与锁的两种方式该如何提效的相关资料,需要的朋友可以参考下
    2022-12-12
  • Golang实现短网址/短链服务的开发笔记分享

    Golang实现短网址/短链服务的开发笔记分享

    这篇文章主要为大家详细介绍了如何使用Golang实现短网址/短链服务,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-05-05
  • Go语言基础函数包的使用学习

    Go语言基础函数包的使用学习

    本文通过一个实现加减乘除运算的小程序来介绍go函数的使用,以及使用函数的注意事项,并引出了对包的了解和使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Go 实现一次性打包各个平台的可执行程序

    Go 实现一次性打包各个平台的可执行程序

    这篇文章主要介绍了Go 实现一次性打包各个平台的可执行程序,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • GoLang中生成UUID唯一标识的实现方法

    GoLang中生成UUID唯一标识的实现方法

    UUID是让分散式系统中的所有元素,都能有唯一的辨识信息,本文主要介绍了GoLang中生成UUID唯一标识的实现方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • GoLang抽奖系统简易实现流程

    GoLang抽奖系统简易实现流程

    这篇文章主要介绍了GoLang抽奖系统实现流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12

最新评论