Рассмотрим следующий код
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
messages := make(chan bool)
var wg sync.WaitGroup
var x = 1000
wg.Add(runtime.NumCPU())
for i := 0; i < runtime.NumCPU(); i++ {
go func(x int) {
defer wg.Done()
var i = 0
for i < x {
i += 1
fmt.Println(i * i)
}
messages <- true
}(x)
}
go func() {
for i := range messages {
fmt.Println(i)
}
}()
wg.Wait()
}
И следующую последнюю пару строк вывода
980100
982081
984064
true
988036
990025
992016
994009
996004
998001
1000000
Так как message <- true
всегда находится в конце цикла for и
for i := range messages {
fmt.Println(i)
}
печатает после того, как канал получает сообщение.
Я ожидаю, что true
будет печататься всегда в конце, как
988036
990025
992016
994009
996004
998001
1000000
true
Но я считаю, что это только иногда вернопочему это так?