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 以安全有效的方式進行通訊。

更新於: 2023-07-06

219 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告