Я пытаюсь понять, почему в этом операторе select
первый случай всегда срабатывает и не ждет заполнения канала.Для этой программы я пытаюсь заставить программу ждать, пока все каналы не будут заполнены, и всякий раз, когда канал заполняется методом, он помещается в первое доступное пространство в массиве каналов
Я пыталсяпомещая строку <-res[i]
в оператор case, но по какой-то причине этот случай всегда отключается независимо от того, есть ли у каналов значение.
package main
import (
"fmt"
"math"
"math/rand"
"time"
)
func numbers(sz int) (res chan float64) {
res = make(chan float64)
go func() {
defer close(res)
num := 0.0
time.Sleep(time.Duration(rand.Intn(1000)) *time.Microsecond)
for i := 0; i < sz; i++ {
num += math.Sqrt(math.Abs(rand.Float64()))
}
num /= float64(sz)
res <- num
return
}()
return
}
func main() {
var nGo int
rand.Seed(42)
fmt.Print("Number of Go routines: ")
fmt.Scanf("%d \n", &nGo)
res := make([]chan float64, nGo)
j:=0
for i := 0; i < nGo; i++ {
res[i] =numbers(1000)
}
for true{
for i := 0; i < nGo; {
select {
case <-res[i]:{
res[j]=res[i]//this line
j++
}
default:
i++
}
}
if j==nGo{
break
}
}
fmt.Println(<-res[nGo-1])
}
В строке печати должно быть напечатано некоторое число с плавающей точкой.