golang中channel使用心得

最近接手其他同學(xué)代碼,發(fā)現(xiàn)業(yè)務(wù)功能實(shí)現(xiàn)了,但是對(duì)于在代碼上,利用channel來充當(dāng)回調(diào)函數(shù),導(dǎo)致channel在整個(gè)代碼中傳遞來,傳遞去,看起來相當(dāng)痛苦,代碼維護(hù)性也比較糟糕。下面寫一些列子來說明這個(gè)情況。

示例1:利用channel充當(dāng)callback

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)
    go handleMsg(ch)
    for index := range ch {
        fmt.Println(index)
    }
}

func handleMsg(ch chan int) {
    t := time.Tick(time.Second)
    index := 0
    for {
        select {
        case <-t:
            ch <- index
            index++
        }
    }
}

雖然看上去,代碼沒啥大問題,這里有個(gè)潛在問題,利用channel的通信來發(fā)送數(shù)據(jù),導(dǎo)致channel暴露在外部。接下來,我們看下示例2

示例2:隱藏內(nèi)部細(xì)節(jié),使用只讀channel

package main

import (
    "fmt"
    "time"
)

func main() {
    for val := range handleMsg() {
        fmt.Println("index", val)
    }
}

func handleMsg() <-chan int {
    ch := make(chan int)
    t := time.Tick(time.Second * 1)
    index := 0
    go func(index int) {
        for {
            select {
            case <-t:
                ch <- index
                index++
            }
        }
    }(index)
    return ch
}

看,經(jīng)過??上面代碼改造,是不是隱藏了channel的細(xì)節(jié),不產(chǎn)生channel的交互式調(diào)用關(guān)系,不要著急,我們看下面示例3??

示例3:函數(shù)做參數(shù)callback

package main

import (
    "fmt"
    "time"
)

func main() {
    callBack := func(index int) {
        fmt.Println("index:",index)
    }
    handleMsg(callBack)
}

func handleMsg(callBack func(index int)) {
    t := time.Tick(time.Second)
    index := 0
    for {
        select {
        case <-t:
            callBack(index)
            index++
        }
    }
}

因?yàn)間olang的函數(shù)可以做參數(shù)傳遞,可以很好解決回調(diào)的問題,這樣沒有帶來channel使用的煩惱,似乎,利用callback這個(gè)特性,使得在代碼上,看起來更加簡潔明了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容