最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang中for循環(huán)遍歷channel時需要注意的問題詳解

 更新時間:2018年04月12日 08:39:32   作者:xialeistudio  
這篇文章主要給大家介紹了關(guān)于golang中for循環(huán)遍歷channel時需要注意的問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

for循環(huán)是Go語言唯一的循環(huán)結(jié)構(gòu),最近在做一個基于RabbitMQ的應(yīng)用,由于官方的qos沒有g(shù)olang的版本,所以出了一點(diǎn)問題。

問題代碼如下:

_, ch, err := component.NewRabbitMQ()
if err != nil {
 panic(err)
}
if err := ch.Qos(10, 0, true); err != nil {
 panic(err)
}
msgs, err := ch.Consume("push", "", false, false, false, false, nil)
if err != nil {
 panic(err)
}
for m := range msgs {
 go func(d *amqp.Delivery) {
   defer func() { d.Ack(false) }
   // 處理消息
  }(&m)
 }

發(fā)現(xiàn)消費(fèi)到10條消息,進(jìn)程就退出了,但是exit code為0,表示系統(tǒng)是正常退出,由于做了日志記錄可以確定消費(fèi)了10條,所以初步確定是qos相關(guān)問題。

排查過程

  • 首先是把d的tag打印出來,發(fā)現(xiàn)全部是一樣的,可以確定是重復(fù)的一條消息
  • 一開始想到可能是經(jīng)典的go協(xié)程執(zhí)行在for循環(huán)結(jié)束以后導(dǎo)致的,但是看我的代碼不屬于這種情況,有使用&m保證每一條消息都是不同循環(huán)傳入的。所以判斷可能是for循環(huán)的傳遞問題。
  • 確定方向之后開始寫了一個測試項目用來驗證我的想法是否正確。

測試代碼

package main
import "fmt"
func main() {
 ch := make(chan int, 10)
 for i := 0; i < 10; i++ {
 ch <- i
 }
 close(ch)
 for v := range ch {
 fmt.Println(&v)
 }
}

執(zhí)行輸出

0xc420086008
0xc420086008
0xc420086008
0xc420086008
0xc420086008
0xc420086008
0xc420086008
0xc420086008
0xc420086008
0xc420086008

到這里才煥然大悟,for循環(huán)中,如果循環(huán)變量不是指針,那么每次的變量是同一個,不過值變了。,所以上例中的RabbitMQ go協(xié)程消費(fèi)消息那里,需要直接傳遞值而不是指針,經(jīng)過測試之后發(fā)現(xiàn),問題確實(shí)解決了。

題外話

測試代碼那里,如果不close掉channel是會發(fā)生死鎖的,原因是 當(dāng)for循環(huán)讀完channel的10個值之后會繼續(xù)嘗試讀取下一個,而由于channel為空又沒關(guān)閉,會一直阻塞形成死鎖

TOOD

研究RabbitMQ Consumer部分的源碼來看看消費(fèi)channel被關(guān)閉的問題。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 詳解Go語言中的監(jiān)視器模式與配置熱更新

    詳解Go語言中的監(jiān)視器模式與配置熱更新

    這篇文章主要為大家詳細(xì)介紹了Go語言中的監(jiān)視器模式與配置熱更新的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • go各種import的使用方法講解

    go各種import的使用方法講解

    今天小編就為大家分享一篇關(guān)于go各種import的使用方法講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Go channel實(shí)現(xiàn)原理分析

    Go channel實(shí)現(xiàn)原理分析

    Channel是go語言內(nèi)置的一個非常重要的特性,也是go并發(fā)編程的兩大基石之一,下面這篇文章主要給大家介紹了關(guān)于Go中channel的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • golang 流式讀取和發(fā)送使用場景示例

    golang 流式讀取和發(fā)送使用場景示例

    這篇文章主要為大家介紹了golang 流式讀取和發(fā)送使用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • GO 函數(shù)式選項模式(Functional Options Pattern)

    GO 函數(shù)式選項模式(Functional Options Pattern)

    Option模式支持傳遞多個參數(shù),并且在參數(shù)個數(shù)、類型發(fā)生變化時保持兼容性,任意順序傳遞參數(shù),下面給大家介紹GO 函數(shù)式選項模式(Functional Options Pattern)的相關(guān)知識,感興趣的朋友一起看看吧
    2021-10-10
  • go語言遍歷文件夾示例

    go語言遍歷文件夾示例

    這篇文章主要介紹了go語言遍歷文件夾示例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-03-03
  • Go語言使用Zap輕松搞定結(jié)構(gòu)化日志

    Go語言使用Zap輕松搞定結(jié)構(gòu)化日志

    在?Go?語言中,有許多日志庫可供選擇,但在性能和靈活性方面,Zap?是其中的佼佼者,下面我們就來看看Go?項目中如何使用?Zap?進(jìn)行結(jié)構(gòu)化日志記錄吧
    2024-11-11
  • Go string轉(zhuǎn)int,int64,int32及注意事項說明

    Go string轉(zhuǎn)int,int64,int32及注意事項說明

    這篇文章主要介紹了Go string轉(zhuǎn)int,int64,int32及注意事項說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • GO實(shí)現(xiàn)文件上傳操作

    GO實(shí)現(xiàn)文件上傳操作

    這篇文章主要為大家詳細(xì)介紹了GO實(shí)現(xiàn)文件上傳操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 深入分析golang多值返回以及閉包的實(shí)現(xiàn)

    深入分析golang多值返回以及閉包的實(shí)現(xiàn)

    相對于C/C++,golang有很多新穎的特性,例如goroutine,channel等等,這些特性其實(shí)從golang源碼是可以理解其實(shí)現(xiàn)的原理。今天這篇文章主要來分析下golang多值返回以及閉包的實(shí)現(xiàn),因為這兩個實(shí)現(xiàn)golang源碼中并不存在,我們必須從匯編的角度來窺探二者的實(shí)現(xiàn)。
    2016-09-09

最新評論

周宁县| 万盛区| 弥勒县| 方城县| 四平市| 龙泉市| 南京市| 固镇县| 阿勒泰市| 旬阳县| 定兴县| 吉林市| 聂拉木县| 道真| 集贤县| 临潭县| 皋兰县| 健康| 柯坪县| 康马县| 沙洋县| 白银市| 藁城市| 阿坝县| 冀州市| 漠河县| 黄石市| 扬州市| 儋州市| 商城县| 灯塔市| 涪陵区| 新野县| 舞钢市| 许昌县| 龙口市| 明溪县| 南岸区| 绥江县| 苍溪县| 江津市|