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