标题不好,但我不知道如何在字符限制内描述它.
作为一个学习练习,我正在尝试编写一个模拟彩票抽奖的Go程序.它绘制六个随机数作为获胜集,然后不断绘制随机数组,随后再次获得该集合.
首先,我编写了一个函数,它接受一个通道并无限循环"向通道添加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),
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在main()我指定两个OS线程,创建一个可以容纳250个6个整数的数组的通道,并draw()在goroutine中启动我的函数.
runtime.GOMAXPROCS(2)
ch := make(chan [6]int, 250)
go draw(ch)
Run Code Online (Sandbox Code Playgroud)
接下来我[4 8 15 16 23 42]从频道中获取一个获胜集(例如),然后是"当前"集合,这意味着最近的抽奖.我将game_played计数器设置为1:
winning := <- ch
current := <- ch
games_played := 1
Run Code Online (Sandbox Code Playgroud)
这是棘手的一点.
在无限循环中,我检查当前平局是否等于获胜平局.如果是,我打印播放的游戏数量,并从循环中断.
如果不是,我设置current为新的抽奖,并递增计数器.然后循环应该if winning == current...反复运行检查,直到匹配为止.
for {
if winning == current {
fmt.Println(games_played)
break
} else {
current := <- ch
games_played += 1
}
}
Run Code Online (Sandbox Code Playgroud)
这是问题:第四行,current := <- ch抛出编译器错误,"当前声明和未使用".我想说"是的,我知道它在向下读取之后没有被使用,但它在循环中被声明,所以它的值在下一次迭代中很重要." 但我无法弄清楚如何,或者我是否做了一些愚蠢的事情.显然,我对Go完全无能为力.但对我来说,思考它,逻辑是合理的.我搞砸了什么?
(注意:我知道一个[1 2 3]不等于平局的疏忽,[2 3 1]现在忽略了这一点.)
第二个电流在if范围内.替换current := <- ch为current = <- ch(无冒号).使用时,在嵌套范围中:=定义新current变量.
if winning == current {
fmt.Println(games_played)
break
} else {
current := <- ch
games_played += 1
}
Run Code Online (Sandbox Code Playgroud)
相当于:
if winning == current {
fmt.Println(games_played)
break
} else {
var current int[6] // you don't want this, as it shadows your
// current form the outher scope
current = <- ch // you want only this guy
games_played += 1
}
Run Code Online (Sandbox Code Playgroud)