处理奇数和偶数

Processing odd and even values

我正在学习 GO 中的通道和并发,但我被困在一个任务上。 我想要传递一个切片、过滤数字然后打印通道值的函数。问题是,当我使用频道时,它会使程序陷入僵局。这是我的代码:

package main

import (
    "fmt"
)

func processOdd(inputs []int) chan int {
    oddValues := make(chan int)
    for _, numbers := range inputs {
        go func(num int) {
            if num%2 != 0 {
                oddValues <- num
            }
        }(numbers)
    }
    return oddValues
}

func processEven(inputs []int) chan int {
    evenValues := make(chan int)
    for _, numbers := range inputs {
        go func(num int) {
            if num%2 == 0 {
                evenValues <- num
            }
        }(numbers)
    }
    return evenValues
}

func main() {
    inputs := []int{1, 17, 34, 56, 2, 8}
    evenCH := processEven(inputs)
    for range inputs {
        fmt.Print(<-evenCH)
    }
}

发送完值后关闭通道:

func processEven(inputs []int) chan int {
    evenValues := make(chan int)
    var wg sync.WaitGroup
    for _, num := range inputs {
        wg.Add(1)
        go func(num int) {
            defer wg.Done()
            if num%2 == 0 {
                evenValues <- num
            }
        }(num)
    }
    go func() {
        wg.Wait()
        close(evenValues)
    }()

    return evenValues
}

代码使用 WaitGroup 等待发送者完成。

循环接收值直到通道关闭:

func main() {
    inputs := []int{1, 17, 34, 56, 2, 8}
    evenCh := processEven(inputs)
    for num := range evenCh {
        fmt.Println(num)
    }
}

通道循环范围,直到通道关闭。