Golang 如何创建单向通道

Golang 如何创建单向通道

在使用go语言通道时,可能会有一些情况,例如清晰的通信意图、增强通信安全性、封装等,您需要创建单向通道。在这篇go语言文章中,我们将学习使用仅发送通道方法、仅接收通道方法、使用接口以及类型转换方法创建单向通道。

双向通道使得通道数据能够传输和接收。有时候,您可能想要限制单向通信,即限制发送或接收操作。

语法

ch := make(chan<- string)

声明一个名为“ch”的单向发送通道。

go sendOnlyChannel(ch, &wg)

要启动一个新的goroutine,我们使用“go”关键字。这里的go关键字正在执行SendOnlyChannel()函数。

var wg sync.WaitGroup

Sync.WaitGroup定义为一个变量,用于同步goroutines。

方法1:使用只发送的通道

这种方法涉及通过在通道声明时省略接收箭头(<-)来指定通道的方向,从而创建一个单向通道。

步骤

  • 创建一个名为”sendOnlyChannel”的函数,该函数接受一个同步指针和一个只发送通道作为参数。

  • 在”sendOnlyChannel”方法中,使用字符串”Hi,” “There,” “from,” “send-only”和”channel”创建一个消息切片。

  • 在所有消息发送完毕后,使用close()方法关闭只发送通道。

  • 使用”wg” WaitGroup变量来同步goroutines。

  • 使用for range循环迭代接收到的只发送通道”ch”中的消息。

  • 使用fmt.Println()方法打印每条接收到的消息。

示例

下面的示例中,我们将看到如何使用只发送通道将值发送给另一个goroutine,而接收的goroutine将处理该消息。

package main

import (
   "fmt"
   "sync"
)

func sendOnlyChannel(ch chan<- string, wg *sync.WaitGroup) {
   defer wg.Done()

   messages := []string{"Hi", "There", "from", "send-only", "channel!"}

   for _, msg := range messages {
      ch <- msg   }

   close(ch) 
}

func main() {
   ch := make(chan string)
   var wg sync.WaitGroup

   wg.Add(1)
   go sendOnlyChannel(ch, &wg)

   for msg := range ch {
      fmt.Println("Received:", msg)
   }

   wg.Wait() 
}

结果

Received: Hi 
Received: There 
Received: from 
Received: send-only 
Received: channel!

方法2:使用只接收通道

该方法涉及通过在通道声明中省略发送箭头(<-)来指定通道的方向,从而创建一个单向的只接收通道。

步骤

  • 在Go环境中设置 “fmt” 和 “sync” 包。

  • 创建一个名为 “receiveOnlyChannel” 的函数,它有两个参数 – 一个只接收通道(-chan int)和一个同步引用。

  • 在 “receiveOnlyChannel” 函数中使用 defer 语句来表示函数的完成,并使用 wg.Done() 方法来表示 goroutine 的完成。

  • 在 for range 循环后使用 close() 函数来结束通道。

  • 打印 “接收完成” 来显示通道已接收到所有值。

  • 在主函数中使用 make() 方法来构建只接收通道 “ch”。在发送完所有值后,使用 close() 函数来关闭通道。

  • 最后,在关闭 receiveOnlyChannel goroutine 之前,使用 wg.Wait() 函数来等待它完成。

示例

在下面的示例中,我们将看到如何使用只接收通道将值发送给另一个 goroutine。

package main

import (
   "fmt"
   "sync"
)

func receiveOnlyChannel(ch <-chan int, wg *sync.WaitGroup) {
   defer wg.Done()

   for num := range ch {
      fmt.Println("Received:", num)
   }

   fmt.Println("Receiving complete")
}

func main() {
   ch := make(chan int)
   var wg sync.WaitGroup

   wg.Add(1)
   go receiveOnlyChannel(ch, &wg)

   for i := 1; i <= 6; i++ {
      ch <- i
   }

   close(ch)
   wg.Wait() 
}

输出

Received: 1 
Received: 2 
Received: 3 
Received: 4 
Received: 5 
Received: 6

Receiving complete

方法3:使用类型转换

这种方法涉及使用类型转换来创建单向通道。我们可以将双向通道转换为仅发送或仅接收的通道。

步骤

  • 添加所需的包(fmt)。

  • 使用make()函数创建一个名为ch的双向通道。

  • 使用类型转换(chan- int)(ch)将双向通道ch转换为只发送的通道sendOnlyCh。

  • 要向只发送的通道发送值,启动一个goroutine:在goroutine中使用for循环从1到6进行迭代。

  • 使用-运算符将每个值传输到只发送的通道sendOnlyCh。

  • 在发送完所有值后,使用close()函数关闭只发送的通道。

  • 在主goroutine中使用for range循环处理和接收双向通道ch的值:使用for num := range ch进行迭代,以处理从通道接收到的每个值。

  • 使用fmt.Println()打印每个接收到的值。使用Println()打印”Programme complete”以显示程序已完成。

示例

以下示例涉及使用双向通道创建只发送的单向通道,并展示了发送和接收操作。

package main

import (
   "fmt"
)

func main() {
   ch := make(chan int)

   sendOnlyCh := (chan<- int)(ch)

   go func() {
      for i := 1; i <= 6; i++ {
         sendOnlyCh <- i
      }
      close(sendOnlyCh)
   }()

   for num := range ch {
      fmt.Println("Received:", num)
   }

   fmt.Println("Program complete")
}

输出

Received: 1 
Received: 2 
Received: 3 
Received: 4 
Received: 5 
Received: 6 

Program complete

结论

在本文中,我们讨论了各种Go语言通道创建技术。单向通道提供了一种强大的通信方式,可以在goroutine之间进行特定的数据传输或接收模式。上述方法可以用于设计涉及数据传递的API,将消息传递到多个通道。这些通道有助于提高可读性并减少信息的滥用。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程