面試企業(yè) 知乎
題目解析 GOLANG ROADMAP社區(qū)
答案1(欒龍生)
如果說goroutine是Go程序并發(fā)的執(zhí)行體,通道就是它們之間的連接。通道可以使一個goroutine發(fā)送特定值到另一個goroutine的通信機制。每一個通道都是一個具體類型的導管,叫做通道的元素類型。例如一個具有int類型元素的通道寫為chan int。
通道是一個用map創(chuàng)建的數(shù)據(jù)結構的引用。當復制或者作為參數(shù)傳遞到一個函數(shù)時,復制的是引用,這樣調用者和被調用者都引用同一份數(shù)據(jù)結構。和其他引用類型一樣,通道的零值是nil。
通道有兩個主要操作:發(fā)送(send)和接收(receive),兩者統(tǒng)稱為通信。send語句從一個goroutine傳輸一個值到另一個在執(zhí)行接收表達式的goroutine。兩個操作都使用<-操作符書寫。發(fā)送語句中,通道和值分別在<-的左右兩邊。在接收表達式中,<-放在通道操作數(shù)前面,在接收表達式中,其結果未被使用也是合法的。
ch <- x //發(fā)送語句x = <-ch //接收語句<-ch //接收語句,丟棄結果
通道支持第三個操作:關閉 (close),它設置一個標志位來指示值當前已經發(fā)送完畢,這個通道后面沒有值了;關閉后的發(fā)送操作將導致宕機。在一個已經關閉的通道上進行接收操作,將獲取所有已經發(fā)送的值,直到通道為空;這時任何接收操作會立即完成,同時獲取到一個通道元素對應的零值。通過調用內置的close函數(shù)來關閉通道:
close(ch)
根據(jù)通道的容量,可以將通道分為無緩沖通道和緩沖通道
- 無緩沖通道
ch = make(chan int) ch = make(chan int, 0)
- 有緩沖通道
ch = make(chan int, 3)
根據(jù)通道傳輸方向,還可以通道分為雙向通道,只讀通道和只寫通道
- 只讀通道
- 只能發(fā)送的通道,允許發(fā)送但不允許接收
chan<- int
- 只寫通道
- 只能接收的通道,允許接收但不允許發(fā)送
<-chan int
答案2(溪尾)
通道類型的值本身就是并發(fā)安全的。在聲明并初始化一個通道時,可以使用內建函數(shù)make,傳給這個函數(shù)第一個參數(shù)為通道具體類型的字面量(如:chan int),還可以接一個可選的整形參數(shù)作為通道的容量,但是這個整形數(shù)據(jù)不能小于零。
通道相當與一個先進先出(FIFO)的隊列,各個元素嚴格按照發(fā)送順序排列,先被發(fā)送的一定會被先接收。使用操作符表示<-
如果定義通道時未指定通道的長度,那么該通道的長度為0,沒有緩沖,即發(fā)送一個數(shù)據(jù)之后,通道就會阻塞,直到該元素被接收。如果定義的長度為n(n為正整數(shù)),那么通道的長度即為n。