糟糕的标题,但我不知道如何在字符限制内描述它。作为学习练习,我正在尝试编写一个模拟彩票抽奖的小围棋程序。它抽取六个随机数作为获胜集,然后不断抽取随机整数的随机数组,直到再次获得该集。首先,我编写了一个函数,它接受一个通道并无限循环“向通道添加 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 := <- chcurrent := <- chgames_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]忽略这一点。)
1 回答
侃侃无极
TA贡献2051条经验 获得超10个赞
第二个电流在if范围内。替换current := <- ch为current = <- ch(无冒号)。使用时,:=您current在嵌套范围内定义一个新变量。
if winning == current {
fmt.Println(games_played)
break
} else {
current := <- ch
games_played += 1
}
相当于:
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
}
- 1 回答
- 0 关注
- 155 浏览
添加回答
举报
0/150
提交
取消