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.

結論

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

更新於: 2023-07-13

98 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告