如何在Go語言中建立單向通道?


在使用Go語言通道時,可能會有明確的通訊意圖、增強的通訊安全性、封裝等等需要建立單向通道的情況。在這篇Go語言文章中,我們將學習如何使用只發送通道方法、只接收通道方法、介面以及型別轉換方法來建立單向通道。

雙向通道允許通道資料被傳輸和接收。有時您可能希望強制執行單向通訊,限制傳送或接收操作。

語法

ch := make(chan<- string)

宣告一個名為“ch”的只發送通道。

go sendOnlyChannel(ch, &wg)

我們使用“go”關鍵字啟動一個新的goroutine。這裡的go關鍵字正在執行SendOnlyChannel()函式。

var wg sync.WaitGroup

Sync.WaitGroup被定義為一個變數,用於同步goroutine。

方法1:使用只發送通道

此方法涉及透過在通道宣告期間省略接收箭頭(<-)來指定通道方向來建立單向通道。

演算法

  • 建立一個名為“sendOnlyChannel”的函式,該函式接受一個同步指標和一個只發送通道作為引數。

  • 在“sendOnlyChannel”方法中建立一個包含字串“Hi”、“There”、“from”、“send-only”和“channel”的訊息切片。

  • 傳送完所有訊息後,使用close()方法關閉只發送通道。

  • 使用“wg”WaitGroup變數同步goroutine。

  • 應使用for range迴圈迭代透過只發送通道“ch”接收到的訊息。

  • 使用fmt.Println()方法列印收到的每條訊息。

示例

在下面的示例中,我們將看到如何使用只發送通道將值傳送到另一個goroutine,而接收goroutine將處理訊息。

package main

import (
   "fmt"
   "sync"
)

func sendOnlyChannel(ch chan<- string, wg *sync.WaitGroup) {
   defer wg.Done()

   messages := []string{"Hi", "There", "from", "send-only", "channel!"}

   for _, msg := range messages {
      ch <- msg   }

   close(ch) 
}

func main() {
   ch := make(chan string)
   var wg sync.WaitGroup

   wg.Add(1)
   go sendOnlyChannel(ch, &wg)

   for msg := range ch {
      fmt.Println("Received:", msg)
   }

   wg.Wait() 
}

輸出

Received: Hi 
Received: There 
Received: from 
Received: send-only 
Received: channel!

方法2:使用只接收通道

此方法涉及透過在通道宣告期間省略傳送箭頭(<-)來指定通道方向來建立單向只接收通道。

演算法

  • 在Go環境中設定“fmt”和“sync”包。

  • 建立一個“receiveOnlyChannel”函式,該函式有兩個引數:一個只接收通道(-chan int)和一個同步引用。

  • 在“receiveOnlyChannel”函式內使用defer語句來發出函式完成訊號,並使用wg.Done()方法發出goroutine完成訊號。

  • 在for range迴圈之後使用close()函式結束通道。

  • 列印“接收完成”以顯示通道已接收所有值。

  • 在主函式中使用make()方法構造只接收通道“ch”。傳送完所有值後,使用close()函式關閉通道。

  • 最後,在關閉receiveOnlyChannel goroutine之前,使用Wait()函式等待其完成。

示例

在下面的示例中,我們將看到如何使用只接收通道將值傳送到另一個goroutine。

package main

import (
   "fmt"
   "sync"
)

func receiveOnlyChannel(ch <-chan int, wg *sync.WaitGroup) {
   defer wg.Done()

   for num := range ch {
      fmt.Println("Received:", num)
   }

   fmt.Println("Receiving complete")
}

func main() {
   ch := make(chan int)
   var wg sync.WaitGroup

   wg.Add(1)
   go receiveOnlyChannel(ch, &wg)

   for i := 1; i <= 6; i++ {
      ch <- i
   }

   close(ch)
   wg.Wait() 
}

輸出

Received: 1 
Received: 2 
Received: 3 
Received: 4 
Received: 5 
Received: 6
 
Receiving complete

方法3:使用型別轉換

此方法涉及透過使用型別轉換來建立單向通道。我們可以將雙向通道轉換為只發送通道或只接收通道。

演算法

  • 新增所需的包(fmt)。

  • 使用make()函式建立一個名為ch的雙向通道。

  • 使用型別轉換(chan<- int)(ch)將雙向通道ch轉換為只發送通道sendOnlyCh。

  • 要向只發送通道傳送值,請啟動一個goroutine:在goroutine中使用for迴圈從1迭代到6。

  • 使用<-運算子將每個值傳輸到只發送通道sendOnlyCh。

  • 傳送完所有值後,使用close()函式關閉只發送通道。

  • 在主goroutine中使用for range迴圈處理和接收來自雙向通道ch的值:使用for num:= range ch迭代接收到的每個值。

  • 使用fmt.Println()列印每個接收到的值。列印“程式完成”以顯示程式已結束。

示例

以下示例涉及使用雙向通道建立單向只發送通道,並顯示傳送和接收操作。

package main

import (
   "fmt"
)

func main() {
   ch := make(chan int)

   sendOnlyCh := (chan<- int)(ch)

   go func() {
      for i := 1; i <= 6; i++ {
         sendOnlyCh <- i
      }
      close(sendOnlyCh)
   }()

   for num := range ch {
      fmt.Println("Received:", num)
   }

   fmt.Println("Program complete")
}

輸出

Received: 1 
Received: 2 
Received: 3 
Received: 4 
Received: 5 
Received: 6 

Program complete

結論

在本文中,我們討論了各種Go語言通道建立技術。單向通道提供了一種在goroutine之間進行通訊的強大方法,同時強制執行特定的資料傳輸或接收模式。上述方法可用於設計涉及資料傳遞的API,以將訊息傳播到多個通道。這些通道有助於增強可讀性並減少資訊的誤用。

更新於:2023年7月5日

251 次檢視

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.