Go语言程序用于检测字符串单向接收通道和整数发送通道。


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

语法

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。现在启动 Goroutine

  • 并打印出已处理的值

示例 1:使用无缓冲通道

对于 goroutine 之间的通信,无缓冲通道是一种有效的方法。通过使用无缓冲通道同步发送方和接收方 goroutine 的操作,确保在发送下一个值之前处理每个值。

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) // Increment the WaitGroup counter

   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 之间进行通信,从而实现高效且并发的數據處理。

更新于:2023年7月5日

107 次浏览

启动您的 职业生涯

完成课程后获得认证

开始学习
广告
© . All rights reserved.