【发布时间】:2021-01-21 15:30:03
【问题描述】:
package main
import (
"fmt"
"strconv"
"time"
)
func generator() chan int {
ch := make(chan int)
go func() {
i := 0
for {
i++
ch <- i
time.Sleep(time.Duration(10) * time.Millisecond)
}
}()
return ch
}
func printer(delay int, square bool, ch chan int) {
for n := range ch {
if (square) {
fmt.Printf("["+strconv.Itoa(n) + "],")
} else {
fmt.Printf("("+strconv.Itoa(n) + "),")
}
time.Sleep(time.Duration(delay) * time.Millisecond)
}
}
func sendToBoth(ch chan int) (ch1 chan int, ch2 chan int) {
ch1 = make(chan int)
ch2 = make(chan int)
go func() {
for {
//n := <- ch
select {
case v := <- ch: //this is the problem point
ch1 <- v //
case v := <- ch: //
ch2 <- v //
}
}
}()
return ch1, ch2
}
func main() {
ch1, ch2 := sendToBoth(generator())
go printer(100, true, ch1) //[]
go printer(200, false, ch2) //()
var name string
fmt.Scan(&name)
}
我想实现 sendToBoth 函数,它从通道 ch 获取生成的数字 1,2,3,... 并将其发送到 ch1 和 ch2。但是每个都有不同的延迟,我不希望一个等待另一个解锁,所以我尝试使用select,但无法弄清楚如何询问如果ch1 或ch2 可以在案例条款的时刻。有什么帮助吗?
输出应该是这样的
(1),[1],[2],(2),[3],[4],(3),[5],[6],(4),[7],[8],...
【问题讨论】:
标签: go concurrency channel goroutine