我正在學習 GO 中的通道和并發性,但我被困在一項任務中。我想要傳遞一個切片、過濾數字然后列印通道值的函式。問題是當我使用通道時,它會使程式死鎖。這是我的代碼:
package main
import (
"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)
}
}
uj5u.com熱心網友回復:
完成發送值后關閉通道:
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)
}
}
通道上的范圍回圈,直到通道關閉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/447725.html
標籤:走
