1. 程式人生 > 其它 >Go從入門到精通——示例:併發列印

Go從入門到精通——示例:併發列印

併發列印

  使用無緩衝通道往裡面裝入資料時,裝入方將被阻塞,直到另外通道在另外一個 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