如何在 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"的函数,该函数接受同步指针和仅发送通道作为参数。
在消息切片中创建一个包含字符串"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,以将消息传播到多个通道。这些通道有助于提高可读性并减少信息滥用。