Использование 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
Наблюдал ли я за недостатком?
Да
Существуют ли какие-либо конкретные сценарии использования?
DRY
Примечание: в producer2
вы должны использовать только канал tx, как этот out chan<- int
вместо out <-chan int
(канал только rx).как этот рабочий код (Run с буферизацией и без буферизации ):
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
}
}()
}