Go語言程式建立單向傳送通道,並將其傳遞給接受整數切片指標的函式


在使用Go語言通道的過程中,有很多情況下需要編寫一個程式,該程式建立一個單向傳送通道,並將其傳遞給一個接受整數切片指標的函式,以進行資料流傳輸、非同步資料共享等。在本Go語言文章中,我們將使用make()函式以及通道型別編寫這樣的程式。

語法

 ch := make(chan<- string)

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

go sendOnlyChannel(ch, &wg) 

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

var wg sync.WaitGroup

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

演算法

  • 定義sendData函式,該函式接受型別為chan int的單向傳送通道ch和整數切片data作為引數。

  • 遍歷data切片中的每個值val:向通道“ch”傳送值val。

  • 關閉通道“ch”以指示不再發送其他值。

  • 確定主函式。建立一個包含值1、2、3、4、5的整數資料切片。

  • 使用make()方法建立一個名為“ch”的型別為“chan int”的雙向通道。

  • 呼叫sendData方法,傳入通道ch和資料切片作為引數,以啟動一個goroutine。

  • 進入迴圈以接收透過通道傳送的值。列印“val”。

示例1

下面給出的程式碼建立一個通道,並啟動一個單獨的goroutine將切片中的值傳送到通道,另一個goroutine列印該值。此程式碼是Go語言中通道之間併發通訊的一個示例。

package main
import "fmt"
func sendData(ch chan<- int, data []int) {
   for _, val := range data {
      ch <- val
   }
   close(ch)
}
func main() {
   data := []int{1, 2, 3, 4, 5}
   ch := make(chan int)
   go sendData(ch, data)
   for val := range ch {
      fmt.Println(val)
   }
}

輸出

1
2
3
4
5

示例2

此程式碼是Go語言中通道之間併發通訊的一個示例。此程式碼引入了done通道,done通道用作完成訊號,它允許主goroutine在傳送通道完成執行之前等待。

package main
import (
   "fmt"
)
func sendData(ch chan<- int, data *[]int, done chan<- bool) {
   for _, val := range *data {
      ch <- val
}
close(ch)
done <- true
}
func main() {
   data := []int{1, 2, 3, 4, 5}
   ch := make(chan int)
   done := make(chan bool)
   go sendData(ch, &data, done)
   for val := range ch {
      fmt.Println(val)
   }
   // Waiting to receive a value indicating completion
   <-done
}

輸出

1
2
3
4
5

結論

在本文中,我們研究了兩種在Go語言中構造單向傳送通道並將其傳遞給接受整數切片指標的函式的方法。第一種方法使用了make()函式,而第二種方法使用了箭頭表示法。make函式正確地分配和初始化記憶體,而箭頭表示法則能夠實現goroutine之間的快速通訊。

更新於:2023年7月13日

78 次檢視

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.