“已声明但未使用”是因为 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),

        }

    }

}

然后在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]忽略这一点。)


红颜莎娜
浏览 156回答 1
1回答

侃侃无极

第二个电流在if范围内。替换current := <- ch为current = <- ch(无冒号)。使用时,:=您current在嵌套范围内定义一个新变量。if winning == current {&nbsp; &nbsp; fmt.Println(games_played)&nbsp; &nbsp; break} else {&nbsp; &nbsp; current := <- ch&nbsp; &nbsp; games_played += 1}相当于:if winning == current {&nbsp; &nbsp; fmt.Println(games_played)&nbsp; &nbsp; break} else {&nbsp; &nbsp; var current int[6] // you don't want this, as it shadows your&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// current form the outher scope&nbsp; &nbsp; current = <- ch // you want only this guy&nbsp; &nbsp; games_played += 1}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go