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+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告