Go 語言程式接收整數通道併發送字串通道
在本文中,我們將學習如何開發一個 Go 語言程式,該程式接收一個整數通道作為輸入,併發送一個字串通道作為輸出。這裡我們將使用併發方法,包括使用多個 goroutine 併發執行轉換以及使用帶超時的 select 語句。
語法
channel_name := make(chan Type)
建立通道。
channel_name <- element
向通道傳送值,element 是值。
variable := <-channel_name
從通道接收值,variable 是接收到的值。
演算法
建立一個名為 transformIntToString 的方法,該方法接收一個用於接收整數的通道和一個用於傳輸(傳送)字串的通道,以及工作 goroutine 的數量。
示例 1
透過啟動迴圈建立 numWorkers 個 goroutine。
在迴圈生成 goroutine 後,使用 wg.Wait() 等待所有工作 goroutine 完成。
關閉傳送通道以指示不再傳輸任何字串。
在主函式中 -
建立一個名為 receive 的接收通道和一個名為 send 的傳送通道。
啟動一個 goroutine,將數字 1 到 10 填充到 receive 通道,然後退出。
啟動另一個 goroutine,使用三個工作 goroutine 執行 transformIntToString 方法。
使用迴圈從傳輸通道接收字串。
使用 fmt.Println(str) 列印每個傳入的字串。
示例 2
啟動一個無限迴圈以無限期地處理通道活動。
使用 select 語句在可用情況之間進行選擇:從 receive 通道接收或從 time.After 接收超時。
在主函式中 -
建立一個名為 receive 的接收通道和一個名為 send 的傳送通道。
啟動一個 goroutine,將數字 0 到 9 填充到 receive 通道,然後結束它。
啟動另一個 goroutine,延遲 2 秒執行 transformIntToString 函式。
使用迴圈從傳輸通道接收字串。
使用 fmt.Println(str) 列印每個傳入的字串。
示例 1:併發方法
當處理大量整數時,我們使用這種方法。在這種方法中,我們可以併發地處理整數,並在併發 goroutine 準備就緒後立即將其傳送到傳送通道。
package main import ( "fmt" "strconv" "sync" ) func transformIntToString(receive <-chan int, send chan<- string, numWorkers int) { var wg sync.WaitGroup wg.Add(numWorkers) for i := 0; i < numWorkers; i++ { go func() { defer wg.Done() for num := range receive { str := strconv.Itoa(num) send <- str } }() } wg.Wait() close(send) } func main() { receive := make(chan int) send := make(chan string) go func() { for i := 1; i <= 10; i++ { receive <- i } close(receive) }() go transformIntToString(receive, send, 3) for str := range send { fmt.Println(str) } }
輸出
1 2 3 4 5 6 7 8 9 10
示例 2:帶超時的 select 語句
我們將透過在 Go 中使用 select 語句為轉換過程引入超時機制。此方法允許我們在從接收通道接收值時最大限度地減少等待時間。
package main import ( "fmt" "strconv" "time" ) func transformIntToString(receive <-chan int, send chan<- string, timeout time.Duration) { for { select { case num, ok := <-receive: if !ok { close(send) return } str := strconv.Itoa(num) send <- str case <-time.After(timeout): close(send) return } } } func main() { receive := make(chan int) send := make(chan string) go func() { for i := 0; i <= 9; i++ { receive <- i } close(receive) }() go transformIntToString(receive, send, time.Second*2) for str := range send { fmt.Println(str) } }
輸出
0 1 2 3 4 5 6 7 8 9
結論
在本文中,我們討論了兩種接收整數通道併發送字串通道的方法:併發方法和 select 語句方法。這些方法允許 goroutine 以安全有效的方式進行通訊。