Golang 生产者 channel 作为参数或作为返回值

标签 go channel

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

producer1producer2 哪个更符合习惯?我是否监督了劣势?有没有具体的使用场景?

下面是 (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})

因此,第一个用例是代码简化 ( DRY ),当您多次需要它时。

What is more idiomatic, producer1 or producer2?

对于您的示例用例 producer1

Did I oversee a disadvantage?

是的

Are there any specific use scenarios?

DRY


注:在producer2你必须像这样使用 tx only channel out chan<- int而不是 out <-chan int (仅接收 channel )。 像这个工作代码(运行 bufferednon-buffered ):

package main

import "fmt"

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

func main() {
    ch := producer1([]int{1, 2, 3, 4})
    for v := range ch {
        fmt.Println(v)
    }
    out := make(chan int)
    producer2([]int{10, 20, 30, 40}, out)
    for v := range out {
        fmt.Println(v)
    }
}

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

关于Golang 生产者 channel 作为参数或作为返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53801256/

相关文章:

go - 需要一个示例,了解赋值运算符的Go语法如何使用通过EBNF指定的语法规则

几分钟后,Go 爬虫在从输出 channel 中选择时停止

ssh - 是否可以查询 ssh 连接中可用的最大 channel 数?

google-app-engine - 如何在不使用 google app engine 的情况下在专用服务器上托管 go 应用程序

unit-testing - Golang - 多个包的有效测试

go - 信号 goroutines 在 channel 关闭时停止

go - 如何确定从 channel 接收的顺序?

并发模式帮助 - 扇入并返回结果?

amazon-web-services - 使用 AWS Golang 开发工具包检索 AWS Config 规则名称列表

c - 将字符串文字传递给 C