首页 > 其他分享 >Golang流水线设计模式实践

Golang流水线设计模式实践

时间:2024-01-14 15:11:24浏览次数:20  
标签:pipeline text value Golang 流水线 设计模式 PipeValue

Golang流水线设计模式实践

原创 俞凡 DeepNoMind DeepNoMind 2024-01-14 11:45 发表于上海 听全文

流水线设计模式对于顺序处理业务数据非常有用,可以以一致的方式直观的定义对数据的处理流程。原文: Using a Pipeline Pattern in Golang[1]

到目前为止,我已经将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包[2]


你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

参考资料

[1]

Using a Pipeline Pattern in Golang: https://tech.jotform.com/pipeline-go-pipeline-pattern-in-golang-5a51e5d811a

[2]

pipeline-go: https://github.com/izniburak/pipeline-go

- END -

 

俞凡 DeepNoMind

 感恩有你,一路同行 

赞赏二维码喜欢作者

Golang37 设计模式9 Golang · 目录 上一篇基于FX构建大型Golang应用下一篇在Go中构建复杂对象: 构建器模式指南 阅读 18 DeepNoMind ​ 喜欢此内容的人还喜欢   Go事件管理器:简单实现     我看过的号 DeepNoMind 不看的原因   Golang中的工厂模式:灵活选择存储方式实现文件存储     我看过的号 程序员的碎碎念 不看的原因   Golang 使用 inline 处理 JSON/YAML 内联字段的2点注意事项     熊猫云原生Go 不看的原因   关注公众号后可以给作者发消息              

人划线

 

标签:pipeline,text,value,Golang,流水线,设计模式,PipeValue
From: https://www.cnblogs.com/cheyunhua/p/17963742

相关文章

  • 【软件开发学习笔记】设计模式
    【软件开发学习笔记】设计模式设计模式设计模式是一种针对面向对象语言的软件设计方法,是对类设计的约束和指导。设计模式由“原则”和“方法”两部分组成,一个设计良好的项目结构应能完美符合“原则”中的要求,而为了实现完美往往需要按照“方法”的指导去设计。原则:这是必须......
  • Java多线程编程实战指南(设计模式篇)PDF
    随着CPU多核时代的到来,多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。而解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案。然而,多线程编程相关的设计模式书籍多采用C++作为描述语言,且书中所举的例子多与应用开发人员的......
  • spring与设计模式之三代理模式
    部分内容引用:https://blog.csdn.net/shulianghan/article/details/119798155一、定义1.1定义对于现实生活中的代理,大家非常好理解。我们需要代理,主要因为几个原因:太忙-例如房产中介、代购目前对象不是自身可以直接接触的-例如托人办事、例如掏钱购买某种服务都可以理解为代......
  • 设计模式之中介者模式
    1.定义多个对象之间通过一个中介者对象进行通信和协作,而不是直接相互交互2.口语化表述中介,这在生活中很常见,比如租房中介通常,有住房出租的房东有很多,需要租房的租客也很多,但是租客难以直接联系房东,这个时候租房中介这个职业就出现了房东将房屋登记到中介这里,租客来中介这里......
  • 【设计模式】工厂方法模式——工厂方法模式在Android SDK源码中的应用
    工厂方法模式在AndroidSDK源码中有广泛的应用,无论app层还是framework层,无论是Java实现的还是Kotlin实现的。BitmapFactoryBitmap的构造方法都没有被public修饰,开发者必须用BitmapFactory来生成Bitmap对象,BitmapFactory中用于生产Bitmap实例的工厂方法如下:publicclassBitmapFacto......
  • golang进程(主线程)与协程
    概念主线程:golang中的主线程(在go中主线程就是进程,相比与其他编程语言叫法不一样)协程:golang中协程是轻量级的线程(相比于其他语言,只有进程和线程);python中有进程和线程的概念,也有协程的概念;python中的协程通过async来实现并发与并行的概念并发:在一个cpu上有10个线程,每个线程10......
  • 一个脚本打包三个平台的linux,mac,windows的golang程序
    一个脚本打包三个平台的linux,mac,windows的golang程序:#!/bin/bash#设置变量APP_NAME="atmp"VERSION="1.0.0"BUILD_TIME=$(date+%Y-%m-%d_%H:%M:%S)BUILD_DIR="bin"PLATFORMS=("linux/amd64""windows/amd64""darwin/amd64&......
  • mac下golang打包到Linux上执行报错:No such file or directory
    本地mac打包golang二进制文件到linux服务器报错:-bash:./atmp-linux:Nosuchfileordirectory很奇怪,明明可执行文件在当前目录下,为什么会找不到呢?使用列出动态库依赖的lld(listdynamicdependencies)命令查看了下,发现:lddatmp-linux发现报错:./atmp-linux:errorwhile......
  • 【设计模式】工厂方法模式——工厂方法模式在JDK源码中的应用
    工厂方法模式在JDK源码中有很多应用场景,不仅有简单工厂模式,还有多工厂模式。Executors尽管ThreadPoolExecutor及其子类都是可以直接new出来的,但Executors还是提供了生产常用ThreadPoolExecutor实例的简单工厂:publicclassExecutors{/***Createsathreadpoolthat......
  • Python实现软件设计模式8:桥接模式 Bridge Pattern
    动机将抽象部分与实现部分分离,使他们都可以独立地变化。用抽象关联取代传统的多层继承。将类之间的静态继承关系转换为动态的对象组合关系。上图展示的软件系统中存在两个独立地变化维度,分别是抽象类(Abstraction)和实现类(Implementor),它俩都是接口、都分别可以独立地扩展出多......