偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Golang中的Channel詳解(一):定義與基本操作

開(kāi)發(fā) 前端
Channel是一個(gè)協(xié)程安全的管道,一端寫入數(shù)據(jù),一端讀取數(shù)據(jù),寫入和讀取都是原子操作,有點(diǎn)類似于消息隊(duì)列,只不過(guò)channel是內(nèi)存級(jí)別的。在channel出現(xiàn)之前,需要手動(dòng)管理共享內(nèi)存,這樣會(huì)帶來(lái)一定的復(fù)雜度和不可知的問(wèn)題。

Golang中的channel是不同goroutines之間進(jìn)行通信和同步的橋梁,借助channel,可以很方便寫多協(xié)程通信程序。

如何理解channel

Channel是一個(gè)協(xié)程安全的管道,一端寫入數(shù)據(jù),一端讀取數(shù)據(jù),寫入和讀取都是原子操作,有點(diǎn)類似于消息隊(duì)列,只不過(guò)channel是內(nèi)存級(jí)別的。在channel出現(xiàn)之前,需要手動(dòng)管理共享內(nèi)存,這樣會(huì)帶來(lái)一定的復(fù)雜度和不可知的問(wèn)題。而channel提供了一種更簡(jiǎn)單、更安全的方式來(lái)進(jìn)行并發(fā)編程,借助channel,可以在不共享內(nèi)存的情況下實(shí)現(xiàn)多個(gè)goroutine之間的通信。

channel的基本操作

使用make()函數(shù)來(lái)創(chuàng)建一個(gè)channel示例,并且需要指定channel中元素的類型和容量(可選),例如:

ch := make(chan int)  // 創(chuàng)建一個(gè)int類型的channel

這條創(chuàng)建語(yǔ)句沒(méi)有指定容量,就是創(chuàng)建了一個(gè)無(wú)緩沖的channel,如果一個(gè)goroutine往這個(gè)channel發(fā)送數(shù)據(jù),那么這個(gè)oroutine就會(huì)被阻塞住,直到有其它goroutine讀取了channel 的數(shù)據(jù)才能繼續(xù)運(yùn)行。創(chuàng)建channel時(shí)如果指定了容量,就是有緩沖的channel,例如:

ch := make(chan int, 10) // 創(chuàng)建一個(gè)容量為10的int類型的channel

對(duì)于有緩沖的channel來(lái)說(shuō),只要當(dāng)前channel里的元素總數(shù)不大于這個(gè)指定的容量,當(dāng)前的goroutine就不會(huì)被阻塞住。

往channel寫數(shù)據(jù)使用<-操作符,例如:

ch := make(chan int)
 ch <- 1 //將值1發(fā)送到通道中

從channel讀取數(shù)據(jù)也是使用<-操作符,例如:

val := <- ch //從通道中接收上一個(gè)發(fā)送的值

當(dāng)不再使用channel時(shí),使用close()方法關(guān)閉channel,例如:

close(ch)

當(dāng)channel關(guān)閉后,如果繼續(xù)往里面寫數(shù)據(jù),則會(huì)panic;如果繼續(xù)讀的話,不會(huì)產(chǎn)生panic,如果還有數(shù)據(jù)的話也可以讀到數(shù)據(jù),如果沒(méi)有數(shù)據(jù)的話將得到零值(對(duì)應(yīng)類型的默認(rèn)值)。判斷當(dāng)前channel是否被關(guān)閉,可以使用下面的寫法:

if v, ok := <-ch; !ok {
   fmt.Println("channel已關(guān)閉并且數(shù)據(jù)已被讀完")
 }

也可以使用for range的方式,讀取完數(shù)據(jù)后循環(huán)也隨著結(jié)束,例如:

for v := range ch {
  // ...
}
責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2023-05-29 09:25:38

GolangSelect

2023-06-27 08:45:19

原子操作Golang

2023-10-31 09:10:39

2023-03-30 07:52:03

Golang接口

2021-09-06 13:15:16

golang chan技巧語(yǔ)言

2023-05-17 08:42:46

深拷貝Golang

2023-08-08 14:51:29

2023-08-02 09:07:27

Golangio 包

2021-06-18 06:31:55

PyTorchPython深度學(xué)習(xí)

2023-06-02 08:29:24

https://wwMutex

2021-11-18 09:20:29

Channel語(yǔ)言代碼

2021-09-22 12:56:19

編程技能Golang

2023-08-03 08:48:07

Golang接口

2023-11-27 15:02:37

BytesGolang

2023-08-31 09:28:12

Golang可導(dǎo)出函數(shù)

2009-06-12 15:13:12

Hibernate學(xué)習(xí)

2023-10-23 12:35:36

Golang追加操作

2010-07-14 12:57:59

Perl字符串

2023-06-05 09:23:00

Golang同步工具

2023-06-26 08:28:35

Sync.CondGolang
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)