【发布时间】:2021-07-06 02:24:03
【问题描述】:
我正在学习 Golang 并编写一些示例程序以熟悉不同的概念。 我写了这个样例来看看 go 例程是如何工作的并遇到了这个问题。 我无法弄清楚这个程序有什么问题。当 generateOddRandomNumbers() 和 geneateEvenRandomNumbers() 中的最后一行被注释掉时,它可以完美运行。
// time.Sleep(time.Duration(val))
当我在这两个函数中取消注释该行时,输出总是错误的。
代码:
package main
import (
"fmt"
"math/rand"
"time"
)
const (
limit = 10000
)
func main() {
rand.Seed(time.Now().UnixNano())
go generateOddRandomNumbers(rand.Intn(9) + 1)
go generateEvenRandomNumbers(rand.Intn(9) + 1)
time.Sleep(1000000)
}
func generateOddRandomNumbers(count int) {
for i := 0; i < count; i++ {
val := rand.Intn(limit)
if val % 2 == 0 {
i--
continue
}
fmt.Printf("Odd[%v/%v] -> %v\n", i + 1, count, val)
// time.Sleep(time.Duration(val))
}
}
func generateEvenRandomNumbers(count int) {
for i := 0; i < count; i++ {
val := rand.Intn(limit)
if val % 2 != 0 {
i--
continue
}
fmt.Printf("Even[%v/%v] -> %v\n", i + 1, count, val)
// time.Sleep(time.Duration(val))
}
}
例如: 良好的输出:Even() 从 1/6 打印到 6/6,Odd() 从 1/3 打印到 3/3
Even[1/6] -> 5202
Even[2/6] -> 2768
Even[3/6] -> 3020
Even[4/6] -> 6386
Even[5/6] -> 8004
Odd[1/3] -> 5075
Odd[2/3] -> 8057
Odd[3/3] -> 9655
Even[6/6] -> 8886
错误输出:(当 time.Sleep() 未注释时) 在下面的例子中,Even 只在 1/9 到 3/9 之间打印(而不是 1/9 到 9/9)
Odd[1/1] -> 4349
Even[1/9] -> 6024
Even[2/9] -> 5444
Even[3/9] -> 6160
有什么想法吗?
【问题讨论】:
-
我仍然对输出应该是什么样子感到困惑。即使我取消注释这些行,我也会得到不同的输出...play.golang.org/p/ornQbpLnU07