登录
首页 >  Golang >  Go问答

使用 Golang 的生产者通道作为函数的参数或返回值

来源:stackoverflow

时间:2024-03-11 20:09:30 446浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《使用 Golang 的生产者通道作为函数的参数或返回值》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

据我所知,在函数中处理生产者通道有两种方法:(1)作为参数或(2)作为返回值。对于(1),该函数是通道的所有者,而(2)中的所有者是未知的(对于该函数。

producer1 producer2 哪个更惯用?我是否发现了劣势?有什么具体的使用场景吗?

以下是(1)和(2)的实现:

func producer1(numbers []int) <-chan int {
    out := make(chan int)
    go func() {
        defer close(out)
        for _, n := range numbers {
            out <- n
        }
    }()
    return out
}

func producer2(numbers []int, out <-chan int) {
    go func() {
        defer close(out)
        for _, n := range numbers {
            out <- n
        }
    }()
}

解决方案


恕我直言:这要看情况。

producer1对该通道的行为和生命周期非常明确(这可能是一件好事),
producer2 允许您将这些值的发射插入到一些更大的上下文中(这也可能是一件好事)。

“好东西”的概念实际上取决于您打算如何在这些功能之外使用这些渠道。

额外说明: producer2 不处理通道的创建,我还会从此函数中删除关闭通道的行。

如果你想知道 producer2 是否完成了它的任务,你可以使用其他方式来发出信号,例如:

func producer2(numbers []int, out <-chan int) (done <-chan struct{}) {
    done = make(chan struct{})

    go func() {
        defer close(done)
        for _, n := range numbers {
            out <- n
        }
    }()

    return done
}

// a caller may check '<-done' to see if producer2 has finished feeding all
// of its numbers into the 'out' channel

本篇关于《使用 Golang 的生产者通道作为函数的参数或返回值》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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