Golang producer通道作为参数或作为返回值

Golang producer通道作为参数或作为返回值,go,channel,Go,Channel,据我所知,函数中有两种处理生产者通道的方法:1作为参数或2作为返回值。对于1,函数是通道的所有者,而对于函数,2中的所有者是未知的 producer1和producer2,哪个更地道?我监督了一个缺点吗?是否有任何特定的使用场景 以下是1和2的实施: func producer1(numbers []int) <-chan int { out := make(chan int) go func() { defer close(out) for

据我所知,函数中有两种处理生产者通道的方法: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
        }
    }()
}
使用ch:=producer1[]int{1,2,3,4}简化了这两行:

out := make(chan int)
producer2([]int{10, 20, 30, 40}, out)
分成一行:

ch := producer1([]int{1, 2, 3, 4})
所以第一个用例是代码简化,当您多次需要它时

producer1和producer2,哪个更地道

对于您的示例用例producer1

我监督了一个缺点吗

是否有任何特定的使用场景

注意:在producer2中,您必须像这样使用tx-only通道out-chan使用ch:=producer1[]int{1,2,3,4}简化这两行:

out := make(chan int)
producer2([]int{10, 20, 30, 40}, out)
分成一行:

ch := producer1([]int{1, 2, 3, 4})
所以第一个用例是代码简化,当您多次需要它时

producer1和producer2,哪个更地道

对于您的示例用例producer1

我监督了一个缺点吗

是否有任何特定的使用场景

注意:在producer2中,您必须像这样使用tx-only通道输出chanIMHO:这取决于具体情况

producer1非常明确该频道的行为和使用寿命,这可能是一件好事, producer2允许您在更大的上下文中插入这些值的释放,这也是一件好事

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

另外一句话:producer2不处理频道的创建,我还将从该函数中删除关闭频道的行。

IMHO:这取决于

producer1非常明确该频道的行为和使用寿命,这可能是一件好事, producer2允许您在更大的上下文中插入这些值的释放,这也是一件好事

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


还有一句话:producer2不处理频道的创建,我也会从这个函数中删除关闭频道的行。

你可以在producer2中使用缓冲或非缓冲频道,而producer1总是使用后者。@MarcinZawiejski:Hi,您可以将缓冲通道和非缓冲通道同时使用:请参阅和。@A.R如果您像在缓冲链接中那样修改producer1代码,当然可以,但问题是在特定的实现中,您不能将缓冲通道与producer1一起使用,您可以将缓冲通道和非缓冲通道与producer2一起使用,而producer1始终使用使用后者。@MarcinZawiejski:Hi,您可以将缓冲通道和非缓冲通道同时使用:see和。@A.R当然可以,如果您像在缓冲链接中那样修改producer1代码,那么问题是具体的实现,其中不能将缓冲通道与producer1一起使用