這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。channel是go語言中的同步工具,有兩種模式
- 緩衝
程式執行序列將阻塞在讀channel的調用處 <- chan; 或當channel滿時,阻塞在寫channel調用處 chan <-。
引用
Sends to a buffered channel block only when the buffer is full. Receives block when the buffer is empty.
- 非緩衝
程式執行序列將阻塞在讀和寫channel的調用處 chan <- 或 <- chan
引用
sends and receives block until the other side is ready.
1. 先來看看緩衝方式
package mainvar a stringvar c = make(chan int, 10)func f() { a = "hello world" c <- 0 //<- c}func main() { go f() <- c //c <- 0 print(a)}
執行結果:
hello word
此時,goroutines f() 先給a賦值,再向channel c中寫入0;goroutines main() 阻塞在 <- c處,直到 f() 中 向管道中c中寫資料語句: c <- 0 執行。
如果將兩處管道操作調換順序,執行結果為空白。因為,main()將不阻塞直接print a,此時f()中a = "hello world"語句可能未執行,所以不一定能有hello world輸出。
2. 再看看非緩衝方式的管道
package mainvar a stringvar c = make(chan int)func f() { a = "hello world" //c <- 0 <- c}func main() { go f() //<- c c <- 0 print(a)}
執行結果:
hello world
此時,goroutines main()阻塞在寫c <- 0語句處;goroutines f() 先給a賦值,再讀管道c。當讀c執行後,main()執行其後的語句,此時 a 是被賦值的。
註:其實讀寫管道都將可能被阻塞,直到有一方的讀或寫完成
此時,將兩處管道操作調換順序,同樣也能夠保證執行順序
go語言的channel是一個重要的同步工具,正確的使用能大大減少同步帶來的麻煩