亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Golang中Channel的用法

 更新時(shí)間:2020年11月09日 17:08:03   作者:極速蝸蝸  
如果說goroutine是Go語言程序的并發(fā)體的話,那么channels則是它們之間的通信機(jī)制。這篇文章主要介紹Golang中Channel的用法,需要的朋友可以參考下

如果說goroutine是Go語言程序的并發(fā)體的話,那么channels則是它們之間的通信機(jī)制。一個(gè)channel是一個(gè)通信機(jī)制,它可以讓一個(gè)goroutine通過它給另一個(gè)goroutine發(fā)送值信息。

1 創(chuàng)建channel

每個(gè)channel都有一個(gè)特殊的類型,也就是channels可發(fā)送數(shù)據(jù)的類型。一個(gè)可以發(fā)送int類型數(shù)據(jù)
的channel一般寫為chan int。使用內(nèi)置的make函數(shù),如果第二個(gè)參數(shù)大于0,則表示創(chuàng)建一個(gè)帶緩存的channel。

ch := make(chan int) // ch has type 'chan int'
ch = make(chan int, 3) // buffered channel with capacity 3

2 channel的發(fā)送和接受

一個(gè)發(fā)送語句將一個(gè)值從一個(gè)goroutine通過channel發(fā)送到另一個(gè)執(zhí)行接收操作的goroutine。發(fā)送和接收兩個(gè)操作都使用<-運(yùn)算符。在發(fā)送語句中,<-運(yùn)算符分割channel和要發(fā)送的值。在接收語句中,<-運(yùn)算符寫在channel對象之前。一個(gè)不使用接收結(jié)果的接收操作也是合法的。

ch <- x
// a send statement
x = <-ch // a receive expression in an assignment statement
<-ch
// a receive statement; result is discarded

3 channel的close

Channel還支持close操作,用于關(guān)閉channel,隨后對基于該channel的任何發(fā)送操作都將導(dǎo)致panic異常。對一個(gè)已經(jīng)被close過的channel進(jìn)行接收操作依然可以接受到之前已經(jīng)成功發(fā)送的數(shù)據(jù),如果channel中已經(jīng)沒有數(shù)據(jù)的話將產(chǎn)生一個(gè)零值的數(shù)據(jù)。使用內(nèi)置的close函數(shù)就可以關(guān)閉一個(gè)channel:

close(ch)

4 不帶緩存的Channels

一個(gè)基于無緩存Channels的發(fā)送操作將導(dǎo)致發(fā)送者goroutine阻塞,直到另一個(gè)goroutine在相同的Channels上執(zhí)行接收操作,當(dāng)發(fā)送的值通過Channels成功傳輸之后,兩個(gè)goroutine可以繼續(xù)執(zhí)行后面的語句。反之,如果接收操作先發(fā)生,那么接收者goroutine也將阻塞,直到有另一個(gè)goroutine在相同的Channels上執(zhí)行發(fā)送操作。
基于無緩存Channels的發(fā)送和接收操作將導(dǎo)致兩個(gè)goroutine做一次同步操作。因?yàn)檫@個(gè)原因,無緩存Channels有時(shí)候也被稱為同步Channels。

5 串聯(lián)的Channels

Channels也可以用于將多個(gè)goroutine連接在一起,一個(gè)Channel的輸出作為下一個(gè)Channel的輸入。這種串聯(lián)的Channels就是所謂的管道(pipeline)。

func main() {
	naturals := make(chan int)
	squares := make(chan int)
	// Counter
	go func() {
		for x := 0; x < 100; x++ {
			naturals <- x
		}
		close(naturals)
	}()
	// Squarer
	go func() {
		for x := range naturals {
			squares <- x * x
		}
		close(squares)
	}()
	// Printer (in main goroutine)
	for x := range squares {
		fmt.Println(x)
	}
}

當(dāng)一個(gè)被關(guān)閉的channel中已經(jīng)發(fā)送的數(shù)據(jù)都被成功接收后,后續(xù)的接收操作將不再阻塞,它們會(huì)立即返回一個(gè)零值。
Go語言的range循環(huán)可直接在channels上面迭代。使用range循環(huán)依次從channel接收數(shù)據(jù),當(dāng)channel被關(guān)閉并且沒有值可接收時(shí)跳出循環(huán)。

6 單方向的Channels

為了防止被濫用,Go語言的類型系統(tǒng)提供了單方向的channel類型,分別用于只發(fā)送或只接收的channel。類型<-chan int表示一個(gè)只接收int的channel, chan<- int表示一個(gè)只發(fā)送int的channel,(箭頭<-和關(guān)鍵字chan的相對位置表明了channel的方向。),這種限制將在編譯期檢測。

func counter(out chan<- int) {
	for x := 0; x < 100; x++ {
			out <- x
		}
		close(out)
	}
	func squarer(out chan<- int, in <-chan int) {
		for v := range in {
			out <- v * v
		}
		close(out)
	}
	func printer(in <-chan int) {
		for v := range in {
			fmt.Println(v)
		}
	}
	func main() {
		naturals := make(chan int)
		squares := make(chan int)
		go counter(naturals)
		go squarer(squares, naturals)
		printer(squares)
}

7 帶緩存的Channels

帶緩存的Channel內(nèi)部持有一個(gè)元素隊(duì)列。隊(duì)列的最大容量是在調(diào)用make函數(shù)創(chuàng)建channel時(shí)通過第二個(gè)參數(shù)指定的。
向緩存Channel的發(fā)送操作就是向內(nèi)部緩存隊(duì)列的尾部插入元素,接收操作則是從隊(duì)列的頭部刪除元素。如果內(nèi)部緩存隊(duì)列是滿的,那么發(fā)送操作將阻塞直到因另一個(gè)goroutine執(zhí)行接收操作而釋放了新的隊(duì)列空間。相反,如果channel是空的,接收操作將阻塞直到有另一個(gè)goroutine執(zhí)行發(fā)送操作而向隊(duì)列插入元素。

  • write:緩沖區(qū)被填滿后,寫端才會(huì)阻塞。
  • read:緩沖區(qū)被讀空,讀端才會(huì)阻塞。

可以用內(nèi)置的cap函數(shù)獲取channel內(nèi)部緩存的容量

fmt.Println(cap(ch)) // "3"

可以用內(nèi)置的len函數(shù)獲取channel內(nèi)部緩存隊(duì)列中有效元素的個(gè)數(shù)。

fmt.Println(len(ch)) // "2"

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

相關(guān)文章

  • Golang對struct字段重新排序優(yōu)化數(shù)據(jù)結(jié)構(gòu)性能實(shí)踐

    Golang對struct字段重新排序優(yōu)化數(shù)據(jù)結(jié)構(gòu)性能實(shí)踐

    這篇文章主要為大家介紹了Golang對struct字段重新排序優(yōu)化數(shù)據(jù)結(jié)構(gòu)性能實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go語言Select chan用法小結(jié)

    Go語言Select chan用法小結(jié)

    select語句是Go語言中用于處理多個(gè)通道操作的關(guān)鍵字,它允許你在多個(gè)通道上進(jìn)行非阻塞的選擇操作,本文就詳細(xì)介紹一下如何使用,感興趣的可以了解一下
    2023-09-09
  • Golang中g(shù)oroutine和channel使用介紹深入分析

    Golang中g(shù)oroutine和channel使用介紹深入分析

    一次只做一件事情并不是完成任務(wù)最快的方法,一些大的任務(wù)可以拆解成若干個(gè)小任務(wù),goroutine可以讓程序同時(shí)處理幾個(gè)不同的任務(wù),goroutine使用channel來協(xié)調(diào)它們的工作,channel允許goroutine互相發(fā)送數(shù)據(jù)并同步,這樣一個(gè)goroutine就不會(huì)領(lǐng)先于另一個(gè)goroutine
    2023-01-01
  • golang 各種排序大比拼實(shí)例

    golang 各種排序大比拼實(shí)例

    這篇文章主要介紹了golang 各種排序大比拼實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 一文帶你掌握Go語言中文件的寫入操作

    一文帶你掌握Go語言中文件的寫入操作

    這篇文章主要和大家分享一下Go語言中文件的寫入操作,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助,需要的小伙伴可以參考一下
    2022-12-12
  • go 對象池化組件 bytebufferpool使用詳解

    go 對象池化組件 bytebufferpool使用詳解

    這篇文章主要為大家介紹了go 對象池化組件 bytebufferpool使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • GoLang?channel關(guān)閉狀態(tài)相關(guān)操作詳解

    GoLang?channel關(guān)閉狀態(tài)相關(guān)操作詳解

    Channel?和?goroutine?的結(jié)合是?Go?并發(fā)編程的大殺器。而?Channel?的實(shí)際應(yīng)用也經(jīng)常讓人眼前一亮,通過與?select,cancel,timer?等結(jié)合,它能實(shí)現(xiàn)各種各樣的功能。接下來,我們就要介紹GoLang?channel關(guān)閉狀態(tài)相關(guān)操作
    2022-10-10
  • go-cqhttp權(quán)限管理系統(tǒng)的實(shí)現(xiàn)代碼

    go-cqhttp權(quán)限管理系統(tǒng)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了go-cqhttp權(quán)限管理,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Go語言中iota的具體使用

    Go語言中iota的具體使用

    Go語言中,iota是一個(gè)用于生成一系列相關(guān)常量值的常量生成器,常應(yīng)用于枚舉、位操作等場景,廣泛用于定義HTTP狀態(tài)碼、權(quán)限控制等,本文就來介紹一下iota的具體使用,感興趣的可以了解一下
    2024-11-11
  • Go框架三件套Gorm?Kitex?Hertz基本用法與常見API講解

    Go框架三件套Gorm?Kitex?Hertz基本用法與常見API講解

    這篇文章主要為大家介紹了Go框架三件套Gorm?Kitex?Hertz的基本用法與常見API講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-02-02

最新評論