Golang 创建一个单向发送通道,并将其传递给一个返回单向接收通道的函数
单向发送通道用于向通道发送值,而单向接收通道用于从通道接收数据。这些通道用于并发数据处理、数据共享等。在这个golang文章中,我们将创建一个程序,创建一个单向发送通道,并将其传递给一个返回单向接收通道的函数,使用函数参数、类型转换和通道组合。
步骤
- 定义一个sender函数,接受一个名为”ch”的只发送通道,类型为integer。
-
使用close函数关闭通道。
-
定义一个receiver函数,接受一个只接收通道,类型为int,以及一个只发送通道,类型为bool。
-
使用range关键字迭代从”ch”通道接收到的值。
-
使用”fmt.println”函数打印接收到的值。
-
一旦通道关闭,发送true值到”done”通道,标记接收函数的完成。
-
在main函数中():
- 使用make函数创建一个名为”sendch”的整数类型通道。
-
使用make函数创建一个名为”done”的布尔类型只发送通道。
-
通过从done通道接收值,等待接收器完成。
-
现在使用”fmt.println”函数打印”程序已终止”。
- 使用make函数创建一个名为”sendch”的整数类型通道。
示例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.
结论
在本文中,我们讨论了单向通道是控制数据流和防止未经授权使用的有效工具。我们探讨了三种不同的方法,包括类型转换,通道组合以及类型转换。