Go 语言程序:创建单向发送通道并将其传递给返回单向接收通道的函数
单向发送通道用于向通道发送值,而单向接收通道用于从通道接收数据。这些通道用于并发数据处理、数据共享等。在这篇 Go 语言文章中,我们将创建一个程序,创建一个单向发送通道并将其传递给一个函数,该函数使用函数参数、类型转换以及通道组合返回一个单向接收通道。
算法
定义一个名为“sender”的发送者函数,该函数接受一个名为“ch”的类型为整数的只发送通道。
使用 close 函数关闭通道。
定义一个名为“receiver”的接收者函数,该函数接受一个类型为 int 的只接收通道和一个类型为 bool 的只发送通道。
使用 range 关键字迭代从“ch”通道接收到的值。
使用“fmt.println”函数打印接收到的值。
通道关闭后,向“done”通道发送 true 值以标记接收者函数的完成。
在 main 函数() 中
使用 make 函数创建一个名为“sendch”的类型为整数的通道。
使用 make 函数创建一个名为“done”的类型为布尔值的“sendonly”通道。
通过从 done 通道接收值来等待接收者完成。
现在使用“fmt.println”函数打印“程序已终止”。
示例 1
此示例创建了两个函数,用于创建单向发送通道以及接受单向发送通道。以下代码演示了如何使用单向通道在 goroutine 之间发送和接收数据。
package main import "fmt" func sender(ch chan<- int) { ch <- 32 close(ch) } func receiver(ch <-chan int, done chan<- bool) { for val := range ch { fmt.Println(val) } done <- true } func main() { sendCh := make(chan int) done := make(chan bool) go sender(sendCh) go receiver(sendCh, done) <-done // Wait for receiver to finish fmt.Println("Program is terminated.") }
输出
32 Program is terminated.
示例 2
此示例涉及创建双向通道并使用类型转换将其转换为单向发送/接收通道。以下代码使用通道来协调 goroutine 之间的数据发送和接收。
package main import ( "fmt" "sync" ) func sender(ch chan<- int, wg *sync.WaitGroup) { ch <- 32 close(ch) wg.Done() } func receiver(ch <-chan int, wg *sync.WaitGroup) { for val := range ch { fmt.Println(val) } wg.Done() } func main() { ch := make(chan int) var wg sync.WaitGroup wg.Add(2) go sender(ch, &wg) go receiver(ch, &wg) wg.Wait() fmt.Println("Program is terminated.") }
输出
32 Program is terminated.
方法 3:使用通道组合
示例
在此示例中,使用“<-“运算符组合通道。它可以创建复合通道以组合发送和接收通道类型。以下代码显示了在 Go 语言中使用只发送通道和只接收通道。
package main import ( "fmt" "sync" ) type SendOnlyChannel chan<- int type ReceiveOnlyChannel <-chan int func sender(ch chan<- int, wg *sync.WaitGroup) { ch <- 22 close(ch) wg.Done() } func receiver(ch <-chan int, wg *sync.WaitGroup) { for val := range ch { fmt.Println(val) } wg.Done() } func main() { sendCh := make(chan int) var sendOnly SendOnlyChannel = sendCh var recvOnly ReceiveOnlyChannel = sendCh var wg sync.WaitGroup wg.Add(2) go sender(sendOnly, &wg) go receiver(recvOnly, &wg) wg.Wait() fmt.Println("Program is terminated.") }
输出
22 Program is terminated.
结论
在本文中,我们讨论了单向通道是控制数据流和防止未经授权使用的有效工具。我们探讨了三种不同的方法,包括类型转换、通道组合以及类型转换。