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.
結論
在本文中,我們討論了單向通道是控制資料流和防止未經授權使用的有效工具。我們探討了三種不同的方法,包括型別轉換、通道組合以及型別轉換。