婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解Golang中Channel的用法

詳解Golang中Channel的用法

熱門標簽:官渡電銷外呼管理系統怎么收費 杭州人工智能電銷機器人費用 利用地圖標注位置 貴州電話智能外呼系統 地圖區域圖標注后導出 谷歌美發店地圖標注 江蘇呼叫中心外呼系統有效果嗎 赤峰電銷 400開頭電話怎樣申請

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

1 創建channel

每個channel都有一個特殊的類型,也就是channels可發送數據的類型。一個可以發送int類型數據
的channel一般寫為chan int。使用內置的make函數,如果第二個參數大于0,則表示創建一個帶緩存的channel。

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

2 channel的發送和接受

一個發送語句將一個值從一個goroutine通過channel發送到另一個執行接收操作的goroutine。發送和接收兩個操作都使用-運算符。在發送語句中,-運算符分割channel和要發送的值。在接收語句中,-運算符寫在channel對象之前。一個不使用接收結果的接收操作也是合法的。

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操作,用于關閉channel,隨后對基于該channel的任何發送操作都將導致panic異常。對一個已經被close過的channel進行接收操作依然可以接受到之前已經成功發送的數據,如果channel中已經沒有數據的話將產生一個零值的數據。使用內置的close函數就可以關閉一個channel:

close(ch)

4 不帶緩存的Channels

一個基于無緩存Channels的發送操作將導致發送者goroutine阻塞,直到另一個goroutine在相同的Channels上執行接收操作,當發送的值通過Channels成功傳輸之后,兩個goroutine可以繼續執行后面的語句。反之,如果接收操作先發生,那么接收者goroutine也將阻塞,直到有另一個goroutine在相同的Channels上執行發送操作。
基于無緩存Channels的發送和接收操作將導致兩個goroutine做一次同步操作。因為這個原因,無緩存Channels有時候也被稱為同步Channels。

5 串聯的Channels

Channels也可以用于將多個goroutine連接在一起,一個Channel的輸出作為下一個Channel的輸入。這種串聯的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)
	}
}

當一個被關閉的channel中已經發送的數據都被成功接收后,后續的接收操作將不再阻塞,它們會立即返回一個零值。
Go語言的range循環可直接在channels上面迭代。使用range循環依次從channel接收數據,當channel被關閉并且沒有值可接收時跳出循環。

6 單方向的Channels

為了防止被濫用,Go語言的類型系統提供了單方向的channel類型,分別用于只發送或只接收的channel。類型-chan int表示一個只接收int的channel, chan- int表示一個只發送int的channel,(箭頭-和關鍵字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內部持有一個元素隊列。隊列的最大容量是在調用make函數創建channel時通過第二個參數指定的。
向緩存Channel的發送操作就是向內部緩存隊列的尾部插入元素,接收操作則是從隊列的頭部刪除元素。如果內部緩存隊列是滿的,那么發送操作將阻塞直到因另一個goroutine執行接收操作而釋放了新的隊列空間。相反,如果channel是空的,接收操作將阻塞直到有另一個goroutine執行發送操作而向隊列插入元素。

  • write:緩沖區被填滿后,寫端才會阻塞。
  • read:緩沖區被讀空,讀端才會阻塞。

可以用內置的cap函數獲取channel內部緩存的容量

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

可以用內置的len函數獲取channel內部緩存隊列中有效元素的個數。

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

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

您可能感興趣的文章:
  • Golang實現Directional Channel(定向通道)
  • Golang的select多路復用及channel使用操作
  • golang開發中channel使用
  • 基于golang channel實現的輕量級異步任務分發器示例代碼
  • golang中for循環遍歷channel時需要注意的問題詳解
  • golang 函數返回chan類型的操作

標簽:保定 泰安 宜春 武漢 松原 鷹潭 黔西 河池

巨人網絡通訊聲明:本文標題《詳解Golang中Channel的用法》,本文關鍵詞  詳解,Golang,中,Channel,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解Golang中Channel的用法》相關的同類信息!
  • 本頁收集關于詳解Golang中Channel的用法的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 青田县| 兴国县| 日照市| 托克托县| 修文县| 黄骅市| 井陉县| 万年县| 荔浦县| 漳平市| 全州县| 日土县| 油尖旺区| 英德市| 白城市| 金华市| 丰台区| 庆安县| 五寨县| 怀柔区| 化州市| 辽宁省| 垣曲县| 湘潭市| 湖北省| 龙胜| 潞城市| 高安市| 广丰县| 内黄县| 山阳县| 泾阳县| 武山县| 仙游县| 镶黄旗| 鹿邑县| 中牟县| 东乡族自治县| 牙克石市| 金寨县| 沽源县|