如何在 Golang 中创建单向通道?

go programmingserver side programmingprogramming更新于 2025/5/15 18:52:17

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

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

语法

ch := make(chan<- string)

声明一个名为"ch"的仅发送通道。

go sendOnlyChannel(ch, &wg)

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

var wg sync.WaitGroup

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

方法 1:使用仅发送通道

此方法涉及通过在通道声明期间省略接收箭头 (<-) 来指定通道的方向来创建单向通道。

算法

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

  • 在消息切片中创建一个包含字符串"Hi"、"There"、"from"、"send-only"和"channel"的消息切片。 "sendOnlyChannel"方法。

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

  • 宣布同步。使用"wg"WaitGroup 变量同步 goroutines。

  • 应使用 for range 循环迭代通过仅发送通道"ch"接收的消息。

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

示例

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

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) 和一个同步引用。

  • 使用 defer 语句来发出函数完成的信号,并使用 wg.Done() 方法在"receiveOnlyChannel"函数内发出 goroutine 完成的信号。

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

  • 打印"接收完成"以显示通道已接收所有值。

  • 使用 make() 方法在主函数中构造仅接收通道"ch"。发送所有值后,使用 close() 函数关闭通道。

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

示例

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

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()。打印"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,以将消息传播到多个通道。这些通道有助于提高可读性并减少信息滥用。


相关文章