'声明并且未使用'因为Go编译器不能考虑循环?

Gre*_*gle 0 go

标题不好,但我不知道如何在字符限制内描述它.

作为一个学习练习,我正在尝试编写一个模拟彩票抽奖的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]现在忽略了这一点.)

kop*_*zko 6

第二个电流在if范围内.替换current := <- chcurrent = <- 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)