糟糕的标题,但我不知道如何在字符限制内描述它。
作为学习练习,我正在尝试编写一个模拟彩票抽奖的小围棋程序。它抽取六个随机数作为获胜集,然后不断抽取随机整数的随机数组,直到再次获得该集。
首先,我编写了一个函数,它接受一个通道并无限循环“向通道添加 6 个随机整数的数组”:
func draw(ch chan<- [6]int) {
generator := rand.New(rand.NewSource(time.Now().UnixNano()))
for {
ch <- [6]int{
generator.Intn(100),
generator.Intn(100),
generator.Intn(100),
generator.Intn(100),
generator.Intn(100),
generator.Intn(100),
}
}
}
然后在main()我指定两个 OS 线程中,创建一个可以容纳 250 个 6 个整数数组的通道,并draw()在 goroutine 中启动我的函数。
runtime.GOMAXPROCS(2)
ch := make(chan [6]int, 250)
go draw(ch)
接下来,我[4 8 15 16 23 42]从频道中取出一个获胜的集合(例如),然后是一个“当前”集合,意思是最近的平局。我将 game_played 计数器设置为 1:
winning := <- ch
current := <- ch
games_played := 1
这是棘手的一点。
在无限循环中,我检查当前平局是否等于获胜平局。如果是,我打印玩的游戏数量,并从循环中中断。
如果不是,我设置current为新的平局,并增加计数器。然后循环应该if winning == current...一遍又一遍地运行检查,直到匹配为止。
for {
if winning == current {
fmt.Println(games_played)
break
} else {
current := <- ch
games_played += 1
}
}
问题是:倒数第四行,current := <- ch抛出编译器错误,“当前已声明但未使用”。我想说“是的,我知道它在向下读取之后不再使用,但它是在循环中声明的,所以它的值在下一次迭代中很重要。” 但我不知道怎么做,或者我是否做了一些愚蠢的事情。显然,我对 Go 一无所知。但对我来说,仔细想想,逻辑是合理的。我搞砸了什么吗?
(注意:我知道抽签[1 2 3]不等于的疏忽,暂时[2 3 1]忽略这一点。)
侃侃无极
相关分类