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

golang開發(fā)中channel使用

 更新時間:2020年09月27日 08:27:21   作者:飛翔碼農(nóng)  
channel[通道]是golang的一種重要特性,正是因為channel的存在才使得golang不同于其它語言。這篇文章主要介紹了golang開發(fā)中channel使用,需要的朋友可以參考下

channel[通道]是golang的一種重要特性,正是因為channel的存在才使得golang不同于其它語言。channel使得并發(fā)編程變得簡單容易有趣。

channel的概念和語法

一個channel可以理解為一個先進(jìn)先出的消息隊列。channel用來在協(xié)程[goroutine]之前傳遞數(shù)據(jù),準(zhǔn)確的說,是用來傳遞數(shù)據(jù)的所有權(quán)。一個設(shè)計良好的程序應(yīng)該確保同一時刻channel里面的數(shù)據(jù)只會被同一個協(xié)程擁有,這樣就可以避免并發(fā)帶來的數(shù)據(jù)不安全問題[data races]。

正文

channel主要是用于多個goroutine之間通信

channel語法

channel是引用類型,需要實用make來創(chuàng)建channel,如下
make(chan Type, [buffer])
chan Type 通道的類型
buffer 是可選參數(shù),代表通道緩沖區(qū)的大小(省略則代表無緩沖)
向channel里面寫入數(shù)據(jù)使用 <- 符號

q := make(chan bool)
q<-true

從channel里面讀取數(shù)據(jù)也是使用 <- 符號,只不過寫入的channel在右邊,讀取的時候channel在左邊。意思跟方向是一致的,一個是數(shù)據(jù)進(jìn)入channel,一個是數(shù)據(jù)從channel出去

q := make(chan bool)
<-q

有緩沖channel的使用

我們一直使用的無緩沖的channel,今天主要學(xué)習(xí)下有緩存的channel。
無緩沖的channel,寫入數(shù)據(jù)后一定要有g(shù)oroutine 從channel讀取數(shù)據(jù)后再寫入,否則程序會panic。

func main() {
	ch := make(chan int)
	ch<-1
}

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:

有緩沖的channel,可以寫入緩沖大小個數(shù)據(jù),可以沒有g(shù)oroutine從channel讀取。

func main() {
	ch := make(chan int,2)
	ch<-1
	ch<-2
}


Process finished with exit code 0

執(zhí)行結(jié)果跟預(yù)期是一致的。

有緩沖大小的channel使用場景

假如我們有一個任務(wù)需要10個goroutine去調(diào)度執(zhí)行,只要有一個goroutine執(zhí)行完畢,調(diào)度就應(yīng)該結(jié)束。我們看下偽代碼

func test(wg *sync.WaitGroup,ch chan int,i int) {
	fmt.Println("test code")
	ch<-i
}

func main() {
	fmt.Println("start",runtime.NumGoroutine())
	ch := make(chan int)
	wg := new(sync.WaitGroup)
	for i:=0;i<10;i++ {
		wg.Add(1)
		go test(wg,ch,i)
	}
	fmt.Println(<-ch)
	fmt.Println("end",runtime.NumGoroutine())
	wg.Done()
}

start 1
test code
9
end 10

從執(zhí)行結(jié)果上看,是第9個goroutine首先執(zhí)行完畢了。程序也正常退出了。但是我們看到,加上主goroutine,內(nèi)存中一共有11個goroutine,程序退出的時候還有10個goroutine,減去一個主goroutine,還有9個goroutine沒有退出,這個對程序來說是不允許,可能會泄漏或者長期占用資源不釋放。

但是我們?nèi)绻褂昧擞芯彌_的channel,就可以利用channel的緩沖機(jī)制正常退出全部的goroutine了。
看下代碼

func test(wg *sync.WaitGroup,ch chan int,i int) {
	ch<-i
}

func main() {
	fmt.Println("start",runtime.NumGoroutine())
	ch := make(chan int, 10)
	wg := new(sync.WaitGroup)
	for i:=0;i<10;i++ {
		wg.Add(1)
		go test(wg,ch,i)
	}
	fmt.Println(<-ch,"success")
	for i:= 0;i<9;i++ {
	 fmt.Println(<-ch)
	}
	fmt.Println("end",runtime.NumGoroutine())
	wg.Done()
}

start 1
0 success
1
2
4
3
5
6
7
8
9
end 1

Process finished with exit code 0

打印success的時候,第一個goroutine已經(jīng)將任務(wù)完成,循環(huán)9次將channel里面的數(shù)據(jù)讀取出來,保證創(chuàng)建的goroutine都不會阻塞能夠正常退出來。

到此這篇關(guān)于golang開發(fā)中channel使用的文章就介紹到這了,更多相關(guān)golang channel使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Go語言實現(xiàn)在終端繪制小兔子

    利用Go語言實現(xiàn)在終端繪制小兔子

    這篇文章主要為大家詳細(xì)介紹了如何利用Go語言實現(xiàn)在終端繪制小兔子來給大家拜個早年,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-01-01
  • Golang使用Gin處理下載文件請求返回

    Golang使用Gin處理下載文件請求返回

    在Go語言中,使用Gin框架實現(xiàn)文件下載功能相對簡單,本文給大家展示一個簡單的示例,演示如何使用Gin來處理文件下載請求,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 分享6個Go處理字符串的技巧小結(jié)

    分享6個Go處理字符串的技巧小結(jié)

    這篇文章主要介紹了分享6個Go處理字符串的技巧小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 深入探究Go語言的錯誤策略與異常機(jī)制

    深入探究Go語言的錯誤策略與異常機(jī)制

    本文深入探討了Go語言的錯誤策略與異常機(jī)制,主要介紹了錯誤處理的重要性,以及Go語言中的錯誤類型和處理函數(shù),此外還討論了Go語言的異常機(jī)制,包括panic和recover函數(shù)的使用,需要的朋友可以參考下
    2024-02-02
  • 淺談go語言中別名類型的使用

    淺談go語言中別名類型的使用

    類型別名是 Go 1.9 版本添加的新功能,主要用于解決代碼升級、遷移中存在的類型兼容性問題,本文主要介紹了go語言中別名類型的使用,感興趣的可以了解一下
    2024-01-01
  • Go語言實現(xiàn)逐行讀取和寫入文件詳解

    Go語言實現(xiàn)逐行讀取和寫入文件詳解

    這篇文章主要介紹了如何使用go語言實現(xiàn)從輸入文件中讀取每行數(shù)據(jù),然后將每行字段組合成SQL插入腳本,然后逐行寫入另外一個空白文件中,有需要的可以參考下
    2024-01-01
  • go語言規(guī)范RESTful?API業(yè)務(wù)錯誤處理

    go語言規(guī)范RESTful?API業(yè)務(wù)錯誤處理

    這篇文章主要為大家介紹了go語言規(guī)范RESTful?API業(yè)務(wù)錯誤處理方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • golang interface指針實現(xiàn)示例

    golang interface指針實現(xiàn)示例

    本文主要介紹了golang interface指針實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Golang使用minio替代文件系統(tǒng)的實戰(zhàn)教程

    Golang使用minio替代文件系統(tǒng)的實戰(zhàn)教程

    本文討論項目開發(fā)中直接文件系統(tǒng)的限制或不足,接著介紹Minio對象存儲的優(yōu)勢,同時給出Golang的實際示例代碼,包括初始化客戶端、讀取minio對象以及設(shè)置過期策略等,需要的朋友可以參考下
    2025-01-01
  • Go項目中的GOPROXY設(shè)置

    Go項目中的GOPROXY設(shè)置

    GOPROXY是Go語言中用于指定模塊代理服務(wù)器的環(huán)境變量,設(shè)置GOPROXY可以通過操作系統(tǒng)環(huán)境變量、Go命令行參數(shù)或Go環(huán)境配置文件進(jìn)行,感興趣的可以了解一下
    2024-09-09

最新評論

安龙县| 泗洪县| 云林县| 聂荣县| 九寨沟县| 兴山县| 明溪县| 秦安县| 山阳县| 洪雅县| 新民市| 上高县| 安宁市| 山丹县| 西和县| 日土县| 灌南县| 乐安县| 五常市| 方山县| 介休市| 玉树县| 宜兰市| 蒙山县| 孝昌县| 上蔡县| 宿松县| 门头沟区| 阳新县| 灌云县| 习水县| 桓台县| 大宁县| 丽江市| 宣武区| 石首市| 玉门市| 汾阳市| 武夷山市| 丰镇市| 逊克县|