Go語言程式:建立大小為5的緩衝通道,並使用迴圈向通道傳送10個整數


本文重點介紹如何建立一個大小為5的緩衝通道,並使用迴圈向該通道傳送10個整數。該程式演示瞭如何建立和使用緩衝通道來發送大量值。我們將使用兩種不同的方法:使用迴圈向通道傳送整數,以及建立一個緩衝通道,並透過示例來闡述這一概念。

語法

ch := make(chan int, bufferSize)

語法`ch := make(chan int, bufferSize)`建立一個型別為int的緩衝通道ch,並指定緩衝區大小,允許傳送方傳送多個值而不會阻塞,直到緩衝區已滿。

sync.waitgroup()

WaitGroup結構體型別提供用於協調多個goroutine執行的方法。它的工作原理是允許你將goroutine新增到等待組,然後等待所有goroutine完成才能繼續執行程式。

wg.done()

函式`wg.Done()`遞減WaitGroup的計數器,表示相應的goroutine已完成其任務。這對於確保WaitGroup在程式繼續執行之前等待所有goroutine完成是必要的。

演算法

  • 使用make函式建立一個大小為5的整數緩衝通道 - `ch := make(chan int, 5)`。

  • 啟動一個迴圈,迭代10次,將整數傳送到通道。

  • 在迴圈內,使用通道的`<=-`運算子將每個整數傳送到通道:`ch <- value`,其中value是當前整數。

  • 傳送完所有10個整數後,關閉通道以指示不再發送值:`close(ch)`。

  • 實現一個單獨的goroutine來接收通道中的值。這可以使用for迴圈和通道的range關鍵字來完成:`for num := range ch { // 處理 num }`。

  • 在接收器goroutine中,根據需要處理每個接收到的整數。

  • 可選地,新增必要的同步機制,例如WaitGroup,以確保程式等待所有goroutine完成。

示例1

在此程式碼中,我們使用`make(chan int, 5)`建立了一個大小為5的緩衝通道ch。然後,我們使用迴圈向通道傳送10個整數。最後,我們關閉通道並使用range迴圈從通道讀取值,列印每個值。

package main

import (
   "fmt"
   "sync"
)

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

   var wg sync.WaitGroup

   wg.Add(1)

   go func() {
      defer wg.Done()

      // Reading and printing the values from the channel
      for value := range ch {
         fmt.Println(value)
      }
   }()

   for i := 0; i < 10; i++ {
      ch <- i
   }

   close(ch)

   wg.Wait()
}

輸出

0
1
2
3
4
5
6
7
8
9

示例2

在此程式碼中,我們建立了一個大小為5的緩衝通道ch。然後,我們使用迴圈使用通道傳送運算子`<=-`向通道傳送10個整數。傳送完所有值後,我們使用close函式關閉通道,以指示不再發送值。最後,我們使用for迴圈遍歷通道,並使用range表示式逐個接收通道中的值。然後,使用fmt.Println函式列印接收到的值。

package main

import (
   "fmt"
   "sync"
)

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

   var wg sync.WaitGroup

   wg.Add(1)
   go func() {
      defer wg.Done()
      for i := 0; i < 10; i++ {
         ch <- i
      }
      close(ch)
   }()

   wg.Add(1)
   go func() {
      defer wg.Done()
      for value := range ch {
         fmt.Println(value)
      }
   }()

   wg.Wait()
}

輸出

0
1
2
3
4
5
6
7
8
9

結論

在這個Go語言程式中,我們有效地建立了一個大小為5的緩衝通道,並使用迴圈向通道傳送了10個整數。緩衝通道允許傳送一定數量的值而不會阻塞傳送方,從而提供了一種有效處理併發操作的方法。透過遵循該演算法,我們能夠在程式中成功地使用通道來促進goroutine之間的通訊。

更新於:2023年7月20日

110 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告