登录
首页 >  Golang >  Go问答

奇数与偶数值的处理

来源:stackoverflow

时间:2024-02-13 13:24:22 474浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《奇数与偶数值的处理》,涉及到,有需要的可以收藏一下

问题内容

我正在学习 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)
    }
}

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

终于介绍完啦!小伙伴们,这篇关于《奇数与偶数值的处理》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>