我正在学习 GO 中的通道和并发性,但我被困在一项任务中。我想要传递一个切片、过滤数字然后打印通道值的函数。问题是,当我使用频道时,它会使程序陷入僵局。这是我的代码:package mainimport ( "fmt")func processOdd(inputs []int) chan int { oddValues := make(chan int) for _, numbers := range inputs { go func(num int) { if num%2 != 0 { oddValues <- num } }(numbers) } return oddValues}func processEven(inputs []int) chan int { evenValues := make(chan int) for _, numbers := range inputs { go func(num int) { if num%2 == 0 { evenValues <- num } }(numbers) } return evenValues}func main() { inputs := []int{1, 17, 34, 56, 2, 8} evenCH := processEven(inputs) for range inputs { fmt.Print(<-evenCH) }}
1 回答
HUH函数
TA贡献1836条经验 获得超4个赞
完成发送值后关闭通道:
func processEven(inputs []int) chan int {
evenValues := make(chan int)
var wg sync.WaitGroup
for _, num := range inputs {
wg.Add(1)
go func(num int) {
defer wg.Done()
if num%2 == 0 {
evenValues <- num
}
}(num)
}
go func() {
wg.Wait()
close(evenValues)
}()
return evenValues
}
该代码使用WaitGroup来等待发送者完成。
循环接收值直到通道关闭:
func main() {
inputs := []int{1, 17, 34, 56, 2, 8}
evenCh := processEven(inputs)
for num := range evenCh {
fmt.Println(num)
}
}
通道上的范围循环,直到通道关闭。
- 1 回答
- 0 关注
- 110 浏览
添加回答
举报
0/150
提交
取消
