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.
结论
在本文中,我们讨论了单向通道是控制数据流和防止未经授权使用的有效工具。我们探讨了三种不同的方法,包括类型转换、通道组合以及类型转换。
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP