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

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

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

前言

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

問題代碼如下:

_, 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)消費到10條消息,進程就退出了,但是exit code為0,表示系統(tǒng)是正常退出,由于做了日志記錄可以確定消費了10條,所以初步確定是qos相關問題。

排查過程

  • 首先是把d的tag打印出來,發(fā)現(xiàn)全部是一樣的,可以確定是重復的一條消息
  • 一開始想到可能是經(jīng)典的go協(xié)程執(zhí)行在for循環(huán)結(jié)束以后導致的,但是看我的代碼不屬于這種情況,有使用&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é)程消費消息那里,需要直接傳遞值而不是指針,經(jīng)過測試之后發(fā)現(xiàn),問題確實解決了。

題外話

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

TOOD

研究RabbitMQ Consumer部分的源碼來看看消費channel被關閉的問題。

總結(jié)

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

相關文章

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

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

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

    go各種import的使用方法講解

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

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

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

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

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

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

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

    go語言遍歷文件夾示例

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

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

    在?Go?語言中,有許多日志庫可供選擇,但在性能和靈活性方面,Zap?是其中的佼佼者,下面我們就來看看Go?項目中如何使用?Zap?進行結(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實現(xiàn)文件上傳操作

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

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

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

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

最新評論

鲁甸县| 夏邑县| 海南省| 青神县| 芜湖市| 马公市| 高要市| 道孚县| 绍兴市| 普定县| 舟山市| 工布江达县| 昌宁县| 沁源县| 兴和县| 林甸县| 新巴尔虎左旗| 吉木萨尔县| 龙井市| 灵山县| 武宣县| 沾化县| 惠州市| 休宁县| 金华市| 安新县| 买车| 翼城县| 深水埗区| 晋宁县| 金沙县| 福州市| 仙居县| 凤庆县| 罗源县| 澄江县| 龙山县| 无极县| 冕宁县| 灌南县| 贺州市|