Go語言程式建立兩個通道,一個用於偶數,另一個用於奇數


在本文中,我們將建立兩個 Go 通道:一個用於偶數,另一個用於奇數。我們將偶數傳送到偶數通道,奇數傳送到奇數通道。這裡我們將使用兩種不同的方法:使用建立偶數和奇數通道以及將偶數和奇數傳送到通道,並附帶示例來闡述概念。

語法

close(evenChan)

這是一個用於關閉通道的內建函式呼叫。這確保了不再有值將傳送到通道,並且在通道上進行傳送操作。

make() 

make() 方法生成給定資料結構型別的已初始化值。

演算法

  • 使用 make 函式建立兩個通道,一個用於偶數,另一個用於奇數:evenCh := make(chan int) 和 oddCh := make(chan int)。

  • 實現一個 goroutine 來生成數字並將其傳送到相應的通道。這可以透過使用迴圈生成數字並根據其奇偶性將其傳送到相應的通道來完成。例如,使用 if 語句檢查數字是偶數還是奇數:if num%2 == 0 { evenCh <- num } else { oddCh <- num }。

  • 在主函式中,啟動生成數字的 goroutine。

  • 使用單獨的 goroutine 從 evenCh 通道接收偶數。這可以透過使用 for 迴圈和通道的 range 關鍵字來完成:for num := range evenCh { // 處理偶數 }。

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

  • 使用另一個單獨的 goroutine 從 oddCh 通道接收奇數,方法與步驟 4 相同。

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

示例 1

此程式碼建立了兩個通道,evenChan 和 oddChan,並生成了兩個 goroutine 分別生成偶數和奇數。然後,主函式使用 range 迴圈從這些通道讀取並列印接收到的數字。

package main

import "fmt"

func generateEvenNumbers(evenChan chan<- int) {
   for i := 0; i <= 10; i += 2 {
      evenChan <- i
   }
   close(evenChan)
}

func generateOddNumbers(oddChan chan<- int) {
   for i := 1; i <= 10; i += 2 {
      oddChan <- i
   }
   close(oddChan)
}

func main() {
   evenChan := make(chan int)
   oddChan := make(chan int)

   go generateEvenNumbers(evenChan)
   go generateOddNumbers(oddChan)

   for evenNum := range evenChan {
      fmt.Println("Even Number:", evenNum)
   }

   for oddNum := range oddChan {
      fmt.Println("Odd Number:", oddNum)
   }
}

輸出

Even Number: 0
Even Number: 2
Even Number: 4
Even Number: 6
Even Number: 8
Even Number: 10
Odd Number: 1
Odd Number: 3
Odd Number: 5
Odd Number: 7
Odd Number: 9

示例 2

在此程式碼中,sendEvenNumbers 函式將偶數傳送到 evenChan 通道,sendOddNumbers 函式將奇數傳送到 oddChan 通道。主函式建立通道,生成 goroutine 將數字傳送到通道,並使用 select 語句從通道接收和列印數字。程式將交錯輸出偶數和奇數,直到從兩個通道接收所有數字。

package main

import "fmt"

func sendEvenNumbers(evenChan chan<- int) {
   for i := 0; i <= 10; i += 2 {
      evenChan <- i
   }
   close(evenChan)
}

func sendOddNumbers(oddChan chan<- int) {
   for i := 1; i <= 10; i += 2 {
      oddChan <- i
   }
   close(oddChan)
}

func main() {
   evenChan := make(chan int)
   oddChan := make(chan int)

   go sendEvenNumbers(evenChan)
   go sendOddNumbers(oddChan)

   for {
      select {
      case evenNum, ok := <-evenChan:
         if ok {
            fmt.Println("Even Number:", evenNum)
         } else {
            evenChan = nil
         }
      case oddNum, ok := <-oddChan:
         if ok {
            fmt.Println("Odd Number:", oddNum)
         } else {
            oddChan = nil
         }
      }

      if evenChan == nil && oddChan == nil {
         break
      }
   }
}

輸出

Odd Number: 1
Odd Number: 3
Odd Number: 5
Odd Number: 7
Odd Number: 9
Even Number: 0
Even Number: 2
Even Number: 4
Even Number: 6
Even Number: 8
Even Number: 10

結論

在本文中,我們研究瞭如何在 Go 中利用通道將偶數和奇數劃分為兩個不同的通道。透過利用 Goroutines 和通道,我們將同時傳送和接收資訊,從而使我們的程式更高效。通道為 Goroutines 之間的通訊和同步提供了一個有效的元件,使能夠在 Go 中開發併發和並行應用程式。

更新於: 2023年7月20日

1K+ 閱讀量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.