Golang 接收整数通道和发送字符串通道

Golang 接收整数通道和发送字符串通道

在本文中,我们将学习如何开发一个接收整数通道并发送字符串通道的Golang程序。在这里,我们将使用并发的方式,即使用多个goroutine来同时执行转换,还将使用带有超时的select语句。

语法

channel_name := make(chan Type)

创建一个频道。

channel_name <- element

将值发送到通道时,element是该值。

variable := <-channel_name

从通道中接收值,变量是接收到的值。

步骤

创建一个名为transformIntToString的方法,该方法接受一个整数通道用于接收字符串通道进行传输(发送),以及工作协程的数量。

示例1

  • 通过启动循环来创建numWorkers个协程。

  • 使用wg在循环生成的协程之后等待所有工作协程完成。

  • 关闭发送通道来表示不再传输额外的字符串。

  • 在主函数中:

    • 创建一个接收通道receive和一个发送通道send。

    • 启动一个协程来用于将数字从1到10填充到接收通道,然后退出。

    • 使用另一个协程以三个工作协程执行transformIntToString方法。

  • 使用循环来从传输通道接收字符串。

  • 使用fmt打印每个输入字符串str.Println(str)。

示例2

  • 启动一个无限循环来无限期地处理通道活动。

  • 使用select语句来选择可用的情况:从接收通道接收或从time.After接收超时。

  • 在主函数中:

    • 创建一个接收通道receive和一个发送通道send。

    • 启动一个协程来用于将数字从0到9填充到接收通道,然后结束它。

    • 使用延迟2秒的另一个协程来执行transformIntToString函数。

    • 使用循环来从传输通道接收字符串。

  • 使用fmt.Println(str)打印每个输入字符串str。

示例1:并发方法

在处理大量整数时使用此方法。在此方法中,我们可以并发地处理整数,并在并发协程准备好后立即将它们发送到字符串发送通道。

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:带超时的查询语句

通过使用go中的查询语句,我们将为转换过程引入超时机制。这种方法允许我们在接收通道中接收值时最大限度地减少等待时间。

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语句方法。这些方法使得goroutines可以以安全有效的方式进行通信。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程