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 次浏览

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告
© . All rights reserved.