3種優雅的Go channel用法

2021-07-25 17:13:42 字數 1905 閱讀 7725

寫go的人應該都聽過rob pike的這句話

do not communicate by sharing memory; instead, share memory by communicating.
相信很多朋友和我一樣,在實際應用中總感覺不到好處,為了用channel而用。但以我的切身體會來說,這是寫**時碰到的場景不複雜、對channel不熟悉導致的,所以希望這篇文章能給大家帶來點新思路,對golang優雅的channel有更深的認識 :)

資料的輸出有時候需要做扇出/入(fan in/out),但是在函式中呼叫常常得修改介面,而且上下游對於資料的依賴程度非常高,所以一般使用通過channel進行fan in/out,這樣就可以輕易實現類似於shell裡的管道。

func fanin(input1, input2 <-chan string) <-chan string 

}}()

return c

}

兩個goroutine之間同步狀態,例如a goroutine需要讓b goroutine退出,一般做法如下:

func main() 

quit <- true // 沒辦法等待b的退出只能sleep

fmt.println("main quit")

}func b()

}}/*

output:12

3main quit

*/

可是了main函式沒辦法等待b合適地退出,所以b quit 沒辦法列印,程式直接退出了。然而,chan是go裡的第一物件,所以可以把chan傳入chan中,所以上面的**可以把quit 定義為chan chan bool,以此控制兩個goroutine的同步

func main() 

wait := make(chan bool)

quit <- wait

<-wait //這樣就可以等待b的退出了

fmt.println("main quit")

}func b()

}}/* output12

3b quit

main quit

*/

在現實生活中,如果你要找美國**聊天,你會怎麼做?第一步打**給在美國的朋友,然後他們也會發動自己的關係網,再找可能認識美國**的人,以此類推,直到找到為止。這在kadmelia分布式系統中也是一樣的,如果需要獲取目標id資訊,那麼就不停地查詢,被查詢節點就算沒有相關資訊,也會返回它覺得最近節點,直到找到id或者等待超時。 好了,這個要用go來實現怎麼做呢?

func recursivecall(ctx context.context, id byte, initialnodes *node) //已見過的節點記錄

request := make(chan *node, 3) //設定請求節點channel

// 輸入初始節點

go func()

}()out:

for

// 在新的請求,超時和上層取消請求中select

select

addnode(rn)

// 將新的節點送入channel

request <- rn}}

}}()

case <-time.after(500 * time.millisecond):

break out // break至外層,否則僅僅是跳至loop外

case <-ctx.done():

break out

} }return

}

這時的buffered channel類似於乙個區域性queue,對需要的節點進行處理,但這段**的精妙之處在於,這裡的block操作是select的,隨時可以取消,而不是要等待或者對queue的長度有認識。

你對這三種channel的用法有什麼疑問,歡迎討論╮(╯▽╰)╭

用Vim優雅的編輯

vim是從vi發展起來的乙個超簡潔的文字編輯器,全稱為vi imporved。使用vim可以實現全鍵盤操作,擺脫滑鼠操作痛苦。vim的設計理念是命令的組合。在vim中可以使用各種各樣的組合命令來完成我們的編輯。模式是乙個編輯器所必備的,幾乎所有的編輯器都會有插入和執行兩種模式,可以用鍵盤和滑鼠完成模...

優雅的用英語罵人

講英語難,吵架更難.雖說人在國外總是想盡辦法以和為貴,但要跟人家吵架怎麼辦?很多人一生氣,所有的英文都忘光了,平常英文就說不出口,更何況是吵架,所以滿腦子浮現的不是 f 就是 s 這樣是很不好的.我還聽過有乙個人很絕,英文罵不過人家就用中文罵,反正對方聽得懂聽不懂都無關緊要,重要的是讓他知道你很兇,...

用Markdown優雅的寫文章

目錄 哪些 支援 markdown編輯器 編輯器工具 編輯器外掛程式 有用的資源 markdown是一種可以使用普通文字編輯器編寫的標記語言,通過簡單的標記語法,它可以使普通文字內容具有一定的格式。簡單點來說,markdown是文字標記語言,在普通文字的基礎上加了一些特殊標記。這些特殊標記會被mar...