Go開發(fā)工程師
未來3-5年企業(yè)高性能項目不可替代的語言,從基礎(chǔ)到項目實戰(zhàn)再到重構(gòu),真正從入門到精通
通道(Channel)是Go語言中一種非常獨特的數(shù)據(jù)結(jié)構(gòu)。它可用于在不同Goroutine之間傳遞類型化的數(shù)據(jù),并且是并發(fā)安全的。相比之下,我們之前介紹的那些數(shù)據(jù)類型都不是并發(fā)安全的。這一點需要特別注意。
Goroutine(也稱為Go程序)可以被看做是承載可被并發(fā)執(zhí)行的代碼塊的載體。它們由Go語言的運行時系統(tǒng)調(diào)度,并依托操作系統(tǒng)線程(又稱內(nèi)核線程)來并發(fā)地執(zhí)行其中的代碼塊。至于怎樣編寫這樣的代碼塊以及怎樣驅(qū)動這樣的代碼塊執(zhí)行,我們先按下不表。
通道類型的表示方法很簡單,僅由兩部分組成,如下:
chan T
在這個類型字面量中,左邊是代表通道類型的關(guān)鍵字chan
,而右邊則是一個可變的部分,即代表該通道類型允許傳遞的數(shù)據(jù)的類型(或稱通道的元素類型)。這兩部分之間需要以空格分隔。
與其它的數(shù)據(jù)類型不同,我們無法表示一個通道類型的值。因此,我們也無法用字面量來為通道類型的變量賦值。我們只能通過調(diào)用內(nèi)建函數(shù)make
來達(dá)到目的。make
函數(shù)可接受兩個參數(shù)。第一個參數(shù)是代表了將被初始化的值的類型的字面量(比如chan int
),而第二個參數(shù)則是值的長度。例如,若我們想要初始化一個長度為5
且元素類型為int
的通道值,則需要這樣寫:
make(chan int, 5)
順便說一句,實際上make
函數(shù)也可以被用來初始化切片類型或字典類型的值。
確切地說,通道值的長度應(yīng)該被稱為其緩存的尺寸。換句話說,它代表著通道值中可以暫存的數(shù)據(jù)的個數(shù)。注意,暫存在通道值中的數(shù)據(jù)是先進(jìn)先出的,即:越早被放入(或稱發(fā)送)到通道值的數(shù)據(jù)會越先被取出(或稱接收)。
下面,我們聲明一個通道類型的變量,并為其賦值:
ch1 := make(chan string, 5)
這樣一來,我們就可以使用接收操作符<-
向通道值發(fā)送數(shù)據(jù)了。當(dāng)然,也可以使用它從通道值接收數(shù)據(jù)。例如,如果我們要向通道ch1
發(fā)送字符串"value1"
,那么應(yīng)該這樣做:
ch1 <- "value1"
另一方面,我們?nèi)粝霃?code class="marker">ch1那里接收字符串,則要這樣:
<- ch1
這時,我們可以直接把接收到的字符串賦給一個變量,如:
value := <- ch1
與針對字典值的索引表達(dá)式一樣,針對通道值的接收操作也可以有第二個結(jié)果值。請看下面的示例:
value, ok := <- ch1
這樣做的目的同樣是為了消除與零值有關(guān)的歧義。這里的變量ok
的值同樣是bool
類型的。它代表了通道值的狀態(tài),true
代表通道值有效,而false
則代表通道值已無效(或稱已關(guān)閉)。更深層次的原因是,如果在接收操作進(jìn)行之前或過程中通道值被關(guān)閉了,則接收操作會立即結(jié)束并返回一個該通道值的元素類型的零值。按照上面的第一種寫法,我們無從判斷接收到零值的原因是什么。不過,有了第二個結(jié)果值之后,這種判斷就好做了。
說到關(guān)閉通道值,我們可以通過調(diào)用內(nèi)建函數(shù)close
來達(dá)到目的,就像這樣:
close(ch1)
請注意,對通道值的重復(fù)關(guān)閉會引發(fā)運行時恐慌。這會使程序崩潰。所以一定要避免這種情況的發(fā)生。另外,在通道值有效的前提下,針對它的發(fā)送操作會在通道值已滿(其中緩存的數(shù)據(jù)的個數(shù)已等于它的長度)時被阻塞。而向一個已被關(guān)閉的通道值發(fā)送數(shù)據(jù)會引發(fā)運行時恐慌。另一方面,針對有效通道值的接收操作會在它已空(其中沒有緩存任何數(shù)據(jù))時被阻塞。除此之外,還有幾條與通道的發(fā)送和接收操作有關(guān)的規(guī)則。不過在這里我們記住上面這三條就可以了。
最后,與切片和字典類型相同,通道類型屬于引用類型。它的零值即為nil
。
請在命令源碼文件index.go的第 12 和 15 行的圓括號中填入相應(yīng)代碼,使程序打印到標(biāo)準(zhǔn)輸出上的內(nèi)容為“數(shù)據(jù)已到達(dá)!”。提示,在第15行,只能使用針對通道值的某種操作。
在第12行,應(yīng)該填入"已達(dá)到!"
。在第15行,應(yīng)該填入<-ch2
。
請驗證,完成請求
由于請求次數(shù)過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報