Go開發(fā)工程師
未來3-5年企業(yè)高性能項(xiàng)目不可替代的語言,從基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)再到重構(gòu),真正從入門到精通
我們?cè)谏弦还?jié)所說的通道,實(shí)際上只是Go語言中的通道的一種。它被稱為帶緩沖的通道,或簡(jiǎn)稱為緩沖通道。
通道有帶緩沖和非緩沖之分。我們已經(jīng)說過,緩沖通道中可以緩存N個(gè)數(shù)據(jù)。我們?cè)诔跏蓟粋€(gè)通道值的時(shí)候必須指定這個(gè)N。相對(duì)的,非緩沖通道不會(huì)緩存任何數(shù)據(jù)。發(fā)送方在向通道值發(fā)送數(shù)據(jù)的時(shí)候會(huì)立即被阻塞,直到有某一個(gè)接收方已從該通道值中接收了這條數(shù)據(jù)。非緩沖的通道值的初始化方法如下:
make(chan int, 0)
注意,在這里,給予make
函數(shù)的第二個(gè)參數(shù)值是0
。
除了上述分類方法,我們還可以以數(shù)據(jù)在通道中的傳輸方向?yàn)橐罁?jù)來劃分通道。默認(rèn)情況下,通道都是雙向的,即雙向通道。如果數(shù)據(jù)只能在通道中單向傳輸,那么該通道就被稱作單向通道。我們?cè)诔跏蓟粋€(gè)通道值的時(shí)候不能指定它為單向。但是,在編寫類型聲明的時(shí)候,我們卻是可以這樣做的。例如:
type Receiver <-chan int
類型Receiver
代表了一個(gè)只可從中接收數(shù)據(jù)的單向通道類型。這樣的通道也被稱為接收通道。在關(guān)鍵字chan
左邊的接收操作符<-
形象地表示出了數(shù)據(jù)的流向。相對(duì)應(yīng)的,如果我們想聲明一個(gè)發(fā)送通道類型,那么應(yīng)該這樣:
type Sender chan<- int
這次<-
被放在了chan
的右邊,并且“箭頭”直指“通道”。想必不用多說你也能明白了。我們可以把一個(gè)雙向通道值賦予上述類型的變量,就像這樣:
var myChannel = make(chan int, 3) var sender Sender = myChannel var receiver Receiver = myChannel
但是,反之則是不行的。像下面這樣的代碼是通不過編譯的:
var myChannel1 chan int = sender
單向通道的主要作用是約束程序?qū)νǖ乐档氖褂梅绞?。比如,我們調(diào)用一個(gè)函數(shù)時(shí)給予它一個(gè)發(fā)送通道作為參數(shù),以此來約束它只能向該通道發(fā)送數(shù)據(jù)。又比如,一個(gè)函數(shù)將一個(gè)接收通道作為結(jié)果返回,以此來約束調(diào)用該函數(shù)的代碼只能從這個(gè)通道中接收數(shù)據(jù)。這屬于API設(shè)計(jì)的范疇。因此我們?cè)谶@里僅了解一下即可。
請(qǐng)?jiān)诿钤创a文件index.go的第 13 行的內(nèi)層圓括號(hào)中填入一個(gè)正整數(shù),使程序打印到標(biāo)準(zhǔn)輸出上的內(nèi)容為:
Received! 6 Sent!
在第13行,應(yīng)該填入0
。請(qǐng)回顧“知識(shí)要點(diǎn)”中加粗的那一句話。請(qǐng)?zhí)钊氪笥诹愕恼麛?shù)、再次運(yùn)行程序,并體會(huì)其中的玄機(jī)。
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報(bào)