Go從入門到精通——示例:併發列印
阿新 • • 發佈:2022-05-11
併發列印
使用無緩衝通道往裡面裝入資料時,裝入方將被阻塞,直到另外通道在另外一個 goroutine 中被取出。同樣,如果通道中沒有放入任何資料,接收方試圖從通道中獲取資料時,同樣被阻塞。傳送和接收的操作是同步完成的。
package main import "fmt" func printer(c chan int) { //建立一個無限迴圈,只有當 data == 0 時候,才會 break 退出迴圈 for { //從 channel 中獲取一個數據,該資料型別為 channel 的資料型別,為init data := <-c if data == 0 { break } fmt.Println("data") } //在退出迴圈時,通過管道通知 main 應結束迴圈 c <- 0 } func main() { //建立一個 channel c := make(chan int) //併發執行 printer,傳入 channel go printer(c) for i := 1; i <= 10; i++ { //將資料通過 channel 投送給 printer c <- i } //通知併發的 printer 結束迴圈 c <- 0 //等待 printer 結束 <-c }
程式碼執行結果:
Starting: D:\go-testfiles\bin\dlv.exe dap --check-go-version=false --listen=127.0.0.1:52060 from d:\go-testfiles DAP server listening at: 127.0.0.1:52060 Type 'dlv help' for list of commands. data data data data data data data data data data