文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

golang中极简流式编程的示例分析

2023-06-20 13:38

关注

这篇文章主要为大家展示了“golang中极简流式编程的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“golang中极简流式编程的示例分析”这篇文章吧。

传统的过程编码方式带来的弊端是显而易见,我们经常有这样的经验,一段时间不维护的代码或者别人的代码,突然拉回来看需要花费较长的时间,理解原来的思路,如果此时有个文档或者注释写的很好的话,可能花的时间会短一点,但是即便如此,很多调用关系也要反复确认才敢动手改动。

下面是一断伪代码,描述过程编码方式:

func A(){    B()    C()}func B(){    do something    D()}func C(){    do something    }func D(){    do something}func main(){    A()}

对照流式风格的写法:

NewStream().Next(A).Next(B).Next(D).Next(C).Go()

当过程风格的代码调用关系复杂时,程序员需要谨慎仔细行事,相比较流式风格的代码比较清爽,主干清晰,尤其是应对需求变更的时候优势明显。

java8里借用lamda表达式实现了一套比较完美的流式编程风格,golang作为一个简洁的语言还没有官方的流式风格的包(可能早就有了,可能是我孤陋寡闻了)有点可惜了。

我参考了gorequest的代码,实现了一套相对比较通用的流式风格的包,实现原理是组成一个任务链表,每一个节点都保存了首节点和下一个节点以及该节点应该执行的回调函数指针,流式任务启动后从第一个节点开始,逐个执行,遇到异常则终止流式任务,直到执行到最后一个,结束任务链。先来看看代码吧:

package Streamimport (    "errors"    "fmt")//定回调函数指针的类型type CB func(interface{}) (interface{}, error)//任务节点结构定义type Stream struct {    //任务链表首节点,其他非首节点此指针永远指向首节点    firstStream *Stream    //任务链表下一个节点,为空表示任务结束    nextStream *Stream    //当前任务对应的执行处理函数,首节点没有可执行任务,处理函数指针为空    cb CB}func NewStream() *Stream {    //生成新的节点    stream := &Stream{}    //设置第一个首节点,为自己    //其他节点会调用run方法将从firs指针开始执行,直到next为空    stream.firstStream = stream    //fmt.Println("new first", stream)    return stream}func (this *Stream) Go(arg interface{}) (interface{}, error) {    //设置为任务链结束    this.nextStream = nil    //fmt.Println("first=", this.firstStream, "second=", this.firstStream.nextStream)    //检查是否有任务节点存在,存在则调用run方法    //run方法是首先执行本任务回调函数指针,然后查找下一个任务节点,并调用run方法    if this.firstStream.nextStream != nil {        return this.firstStream.nextStream.run(arg)    } else {        //流式任务终止        return nil, errors.New("Not found execute node.")    }}func (this *Stream) run(arg interface{}) (interface{}, error) {    //fmt.Println("run,args=", args)    //执行本节点函数指针    result, err := this.cb(arg)    //然后调用下一个节点的Run方法    if this.nextStream != nil && err == nil {        return this.nextStream.run(result)    } else {        //任务链终端,流式任务执行完毕        return result, err    }}func (this *Stream) Next(cb CB) *Stream {    //创建新的Stream,将新的任务节点Stream连接在后面    this.nextStream = &Stream{}    //设置流式任务链的首节点    this.nextStream.firstStream = this.firstStream    //设置本任务的回调函数指针    this.nextStream.cb = cb    //fmt.Println("next=", this.nextStream)    return this.nextStream}

下面是一个流式的例子,这里以早上起床到出门上班的流程为例:

//起床func GetUP(arg interface{}) (interface{}, error) {    t, _ := arg.(string)    fmt.Println("铃铃.......", t, "###到时间啦,再不起又要迟到了!")    return "醒着的状态", nil}//蹲坑func GetPit(arg interface{}) (interface{}, error) {    s, _ := arg.(string)    fmt.Println(s, "###每早必做的功课,蹲坑!")    return "舒服啦", nil}//洗脸func GetFace(arg interface{}) (interface{}, error) {    s, _ := arg.(string)    fmt.Println(s, "###洗脸很重要!")    return "脸已经洗干净了,可以去见人了", nil}//刷牙func GetTooth(arg interface{}) (interface{}, error) {    s, _ := arg.(string)    fmt.Println(s, "###刷牙也很重要!")    return "牙也刷干净了,可以放心的大笑", nil}//吃早饭func GetEat(arg interface{}) (interface{}, error) {    s, _ := arg.(string)    fmt.Println(s, "###吃饭是必须的(需求变更了,原来的流程里没有,这次加上)")    return "吃饱饱了", nil}//换衣服func GetCloth(arg interface{}) (interface{}, error) {    s, _ := arg.(string)    fmt.Println(s, "###还要增加一个换衣服的流程!")    return "找到心仪的衣服了", nil}//出门func GetOut(arg interface{}) (interface{}, error) {    s, _ := arg.(string)    fmt.Println(s, "###一切就绪,可以出门啦!")    return "", nil}func main() {    NewStream().        Next(GetUP).        Next(GetPit).        Next(GetTooth).        Next(GetFace).        Next(GetEat).//需求变更了后加上的        Next(GetCloth).        Next(GetOut).        Go("2018年1月28日8点10分")}

从上面的代码看,流式编码风格对于一个大的任务被分解成多个小任务后,在代码层面是非常直观的,不在费劲心思去查找到底那个调用了那个,另外对于需求的变更更容易了,上例中的吃早饭是第一个版本没有实现的,客户说了早上要吃饭,不然容易的胆结石,第二版要加上,我们需要完成吃饭的函数,然后加到响应的位置。相对过程编码简单了不少。

以上是“golang中极简流式编程的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯