真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

golang中極簡(jiǎn)流式編程的示例分析

這篇文章主要為大家展示了“golang中極簡(jiǎn)流式編程的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“golang中極簡(jiǎn)流式編程的示例分析”這篇文章吧。

成都創(chuàng)新互聯(lián)公司服務(wù)緊隨時(shí)代發(fā)展步伐,進(jìn)行技術(shù)革新和技術(shù)進(jìn)步,經(jīng)過(guò)10年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計(jì)師、專業(yè)的網(wǎng)站實(shí)施團(tuán)隊(duì)以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對(duì)網(wǎng)站進(jìn)行成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、建設(shè)、維護(hù)、更新和改版,實(shí)現(xiàn)客戶網(wǎng)站對(duì)外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。

傳統(tǒng)的過(guò)程編碼方式帶來(lái)的弊端是顯而易見(jiàn),我們經(jīng)常有這樣的經(jīng)驗(yàn),一段時(shí)間不維護(hù)的代碼或者別人的代碼,突然拉回來(lái)看需要花費(fèi)較長(zhǎng)的時(shí)間,理解原來(lái)的思路,如果此時(shí)有個(gè)文檔或者注釋寫(xiě)的很好的話,可能花的時(shí)間會(huì)短一點(diǎn),但是即便如此,很多調(diào)用關(guān)系也要反復(fù)確認(rèn)才敢動(dòng)手改動(dòng)。

下面是一斷偽代碼,描述過(guò)程編碼方式:

func A(){
    B()
    C()
}

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

對(duì)照流式風(fēng)格的寫(xiě)法:

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

當(dāng)過(guò)程風(fēng)格的代碼調(diào)用關(guān)系復(fù)雜時(shí),程序員需要謹(jǐn)慎仔細(xì)行事,相比較流式風(fēng)格的代碼比較清爽,主干清晰,尤其是應(yīng)對(duì)需求變更的時(shí)候優(yōu)勢(shì)明顯。

java8里借用lamda表達(dá)式實(shí)現(xiàn)了一套比較完美的流式編程風(fēng)格,golang作為一個(gè)簡(jiǎn)潔的語(yǔ)言還沒(méi)有官方的流式風(fēng)格的包(可能早就有了,可能是我孤陋寡聞了)有點(diǎn)可惜了。

我參考了gorequest的代碼,實(shí)現(xiàn)了一套相對(duì)比較通用的流式風(fēng)格的包,實(shí)現(xiàn)原理是組成一個(gè)任務(wù)鏈表,每一個(gè)節(jié)點(diǎn)都保存了首節(jié)點(diǎn)和下一個(gè)節(jié)點(diǎn)以及該節(jié)點(diǎn)應(yīng)該執(zhí)行的回調(diào)函數(shù)指針,流式任務(wù)啟動(dòng)后從第一個(gè)節(jié)點(diǎn)開(kāi)始,逐個(gè)執(zhí)行,遇到異常則終止流式任務(wù),直到執(zhí)行到最后一個(gè),結(jié)束任務(wù)鏈。先來(lái)看看代碼吧:

package Stream

import (    "errors"
    "fmt")/**
流式工作原理:
各個(gè)任務(wù)都過(guò)指針鏈表的方式組成一個(gè)任務(wù)鏈,這個(gè)任務(wù)鏈從第一個(gè)開(kāi)始執(zhí)行,直到最后一個(gè)
每一個(gè)任務(wù)節(jié)點(diǎn)執(zhí)行完畢會(huì)將結(jié)果帶入到下一級(jí)任務(wù)節(jié)點(diǎn)中。
每一個(gè)任務(wù)是一個(gè)Stream節(jié)點(diǎn),每個(gè)任務(wù)節(jié)點(diǎn)都包含首節(jié)點(diǎn)和下一個(gè)任務(wù)節(jié)點(diǎn)的指針,
除了首節(jié)點(diǎn),每個(gè)節(jié)都會(huì)設(shè)置一個(gè)回調(diào)函數(shù)的指針,用本節(jié)點(diǎn)的任務(wù)執(zhí)行,
最后一個(gè)節(jié)點(diǎn)的nextStream為空,表示任務(wù)鏈結(jié)束。
**///定回調(diào)函數(shù)指針的類型type CB func(interface{}) (interface{}, error)//任務(wù)節(jié)點(diǎn)結(jié)構(gòu)定義type Stream struct {    //任務(wù)鏈表首節(jié)點(diǎn),其他非首節(jié)點(diǎn)此指針永遠(yuǎn)指向首節(jié)點(diǎn)
    firstStream *Stream    //任務(wù)鏈表下一個(gè)節(jié)點(diǎn),為空表示任務(wù)結(jié)束
    nextStream *Stream    //當(dāng)前任務(wù)對(duì)應(yīng)的執(zhí)行處理函數(shù),首節(jié)點(diǎn)沒(méi)有可執(zhí)行任務(wù),處理函數(shù)指針為空    cb CB
}/**
創(chuàng)建新的流
**/func NewStream() *Stream {    //生成新的節(jié)點(diǎn)
    stream := &Stream{}    //設(shè)置第一個(gè)首節(jié)點(diǎn),為自己    //其他節(jié)點(diǎn)會(huì)調(diào)用run方法將從firs指針開(kāi)始執(zhí)行,直到next為空
    stream.firstStream = stream    //fmt.Println("new first", stream)
    return stream
}/**
流結(jié)束
arg為流初始參數(shù),初始參數(shù)放在End方法中是考慮到初始參數(shù)不需在任務(wù)鏈中傳遞
**/func (this *Stream) Go(arg interface{}) (interface{}, error) {    //設(shè)置為任務(wù)鏈結(jié)束
    this.nextStream = nil    //fmt.Println("first=", this.firstStream, "second=", this.firstStream.nextStream)    //檢查是否有任務(wù)節(jié)點(diǎn)存在,存在則調(diào)用run方法    //run方法是首先執(zhí)行本任務(wù)回調(diào)函數(shù)指針,然后查找下一個(gè)任務(wù)節(jié)點(diǎn),并調(diào)用run方法
    if this.firstStream.nextStream != nil {        return this.firstStream.nextStream.run(arg)
    } else {        //流式任務(wù)終止
        return nil, errors.New("Not found execute node.")
    }
}
func (this *Stream) run(arg interface{}) (interface{}, error) {    //fmt.Println("run,args=", args)    //執(zhí)行本節(jié)點(diǎn)函數(shù)指針
    result, err := this.cb(arg)    //然后調(diào)用下一個(gè)節(jié)點(diǎn)的Run方法
    if this.nextStream != nil && err == nil {        return this.nextStream.run(result)
    } else {        //任務(wù)鏈終端,流式任務(wù)執(zhí)行完畢
        return result, err
    }
}
func (this *Stream) Next(cb CB) *Stream {    //創(chuàng)建新的Stream,將新的任務(wù)節(jié)點(diǎn)Stream連接在后面
    this.nextStream = &Stream{}    //設(shè)置流式任務(wù)鏈的首節(jié)點(diǎn)
    this.nextStream.firstStream = this.firstStream    //設(shè)置本任務(wù)的回調(diào)函數(shù)指針
    this.nextStream.cb = cb    //fmt.Println("next=", this.nextStream)
    return this.nextStream
}

下面是一個(gè)流式的例子,這里以早上起床到出門(mén)上班的流程為例:

//起床func GetUP(arg interface{}) (interface{}, error) {
    t, _ := arg.(string)
    fmt.Println("鈴鈴.......", t, "###到時(shí)間啦,再不起又要遲到了!")    return "醒著的狀態(tài)", 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 "臉已經(jīng)洗干凈了,可以去見(jiàn)人了", 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, "###吃飯是必須的(需求變更了,原來(lái)的流程里沒(méi)有,這次加上)")    return "吃飽飽了", nil
}//換衣服func GetCloth(arg interface{}) (interface{}, error) {
    s, _ := arg.(string)
    fmt.Println(s, "###還要增加一個(gè)換衣服的流程!")    return "找到心儀的衣服了", nil
}//出門(mén)func GetOut(arg interface{}) (interface{}, error) {
    s, _ := arg.(string)
    fmt.Println(s, "###一切就緒,可以出門(mén)啦!")    return "", nil

}
func main() {
    NewStream().
        Next(GetUP).
        Next(GetPit).
        Next(GetTooth).
        Next(GetFace).
        Next(GetEat).//需求變更了后加上的        Next(GetCloth).
        Next(GetOut).
        Go("2018年1月28日8點(diǎn)10分")
}

從上面的代碼看,流式編碼風(fēng)格對(duì)于一個(gè)大的任務(wù)被分解成多個(gè)小任務(wù)后,在代碼層面是非常直觀的,不在費(fèi)勁心思去查找到底那個(gè)調(diào)用了那個(gè),另外對(duì)于需求的變更更容易了,上例中的吃早飯是第一個(gè)版本沒(méi)有實(shí)現(xiàn)的,客戶說(shuō)了早上要吃飯,不然容易的膽結(jié)石,第二版要加上,我們需要完成吃飯的函數(shù),然后加到響應(yīng)的位置。相對(duì)過(guò)程編碼簡(jiǎn)單了不少。

以上是“golang中極簡(jiǎn)流式編程的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


文章名稱:golang中極簡(jiǎn)流式編程的示例分析
本文URL:http://weahome.cn/article/igpepc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部