据我所知,有两种方法可以在函数内处理生产者 channel :(1) 作为参数或 (2) 作为返回值。对于 (1),函数是 channel 的所有者,而 (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})
因此,第一个用例是代码简化 ( DRY ),当您多次需要它时。
What is more idiomatic,
producer1
orproducer2
?
对于您的示例用例 producer1
Did I oversee a disadvantage?
是的
Are there any specific use scenarios?
注:在producer2
你必须像这样使用 tx only channel out chan<- int
而不是 out <-chan int
(仅接收 channel )。
像这个工作代码(运行 buffered 和 non-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/