Golang 用于检测字符串的单向接收通道和整数的发送通道

Golang 用于检测字符串的单向接收通道和整数的发送通道

单向通道是一种只能用于接收或发送数据的通道类型。在本文中,我们将创建一个Golang程序,用于检测由字符串组成的接收通道和包含整数的发送通道。在这里,我们将学习如何利用单向通道接收字符串和发送整数,使用无缓冲和有缓冲通道,使用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。现在启动goroutines。

  • 打印出处理后的值。

示例1:使用非缓冲通道

为了让go-routines之间进行通信,非缓冲通道是一种有效的方法之一。通过使用非缓冲通道同步发送器goroutines和接收器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) // 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语言内置的并发支持和通道,您可以轻松地在goroutines之间进行通信,实现高效且并发的数据处理。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程