Golang 程序检测单向字符串接收通道和整数发送通道。

go programmingserver side programmingprogramming

单向通道是一种只能用于接收或发送数据的通道。在本文中,我们将创建一个 golang 程序来检测由字符串组成的接收通道和其中包含整数的发送通道。在这里,我们将学习如何利用单向通道接收字符串并使用无缓冲和缓冲通道发送整数、选择语句以及使用结构来组合通道。

语法

ch := make(chan string)

创建一个通道来处理字符串。

ch <- "Hello, World!"

发送字符串值

message := <-ch

接收字符串值

<-chan string

这表示字符串的单向接收通道

算法

  • 导入"fmt"和"sync"包。

  • 定义"processString"和"processData"函数。

  • 使用"processData"方法中的 defer 行推迟对 wg.Done() 的调用。当 goroutine 完成时,这将通知 WaitGroup。

  • 使用 range 循环,迭代从输入通道 (in) 接收的值。

  • 在主函数中创建一个名为"input"的输入通道和一个名为"output"的输出通道。

  • 创建一个名为"wg"的 WaitGroup 并使用它来将计数器加 1。现在启动 Goroutines

  • 并打印出处理后的值

示例 1:使用无缓冲通道

对于 go-routines 彼此通信,无缓冲通道是有效方法之一。通过使用无缓冲通道同步发送方和接收方 goroutines 的操作,可以确保在传输下一个值之前处理每个值。

package main

import (
   "fmt"
   "sync"
)

func processString(value string) int {
   return len(value)
}

func processData(in <-chan string, out chan<- int, wg *sync.WaitGroup) {
   defer wg.Done()

   for value := range in {
      processedValue := processString(value)

      out <- processedValue
   }
}

func main() {
   input := make(chan string)
   output := make(chan int)

   var wg sync.WaitGroup
   wg.Add(1) // 增加 WaitGroup 计数器

   go processData(input, output, &wg)

   go func() {
      defer close(input)

      input <- "123"
      input <- "456"
      input <- "789"
   }()

   go func() {
      defer close(output)

      for processedValue := range output {
         fmt.Println(processedValue)
      }
   }()

   wg.Wait()
}

输出

3
3
3

示例 2:使用 select 语句

Select 语句使我们能够同时管理多个渠道活动。Select 语句确保程序继续执行已准备好处理的操作,从而避免不必要的等待时间。

package main

import (
   "fmt"
   "sync"
)
func processString(value string) int {

   return len(value)
}
func processData(in <-chan string, out chan<- int, wg *sync.WaitGroup) {
   defer wg.Done() 

   for value := range in {
      processedValue := processString(value)

      out <- processedValue
   }
}
func main() {
   input := make(chan string)
   output := make(chan int, 10) 

   var wg sync.WaitGroup
   wg.Add(1) 

   go processData(input, output, &wg)

   input <- "123"
   input <- "456"
   input <- "789"
   close(input)

   go func() {
      for processedValue := range output {
         fmt.Println(processedValue)
      }
   }()

   wg.Wait()

   close(output)
}

输出

3
3
3

结论

在本文中,我们讨论了如何编写一个使用单向通道接收文本并传输整数的程序。您可以通过 Go 的内置并发支持和通道轻松地跨 goroutine 进行通信,从而实现高效的并发数据处理。


相关文章