糟糕的標(biāo)題,但我不知道如何在字符限制內(nèi)描述它。作為學(xué)習(xí)練習(xí),我正在嘗試編寫(xiě)一個(gè)模擬彩票抽獎(jiǎng)的小圍棋程序。它抽取六個(gè)隨機(jī)數(shù)作為獲勝集,然后不斷抽取隨機(jī)整數(shù)的隨機(jī)數(shù)組,直到再次獲得該集。首先,我編寫(xiě)了一個(gè)函數(shù),它接受一個(gè)通道并無(wú)限循環(huán)“向通道添加 6 個(gè)隨機(jī)整數(shù)的數(shù)組”: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()我指定兩個(gè) OS 線(xiàn)程中,創(chuàng)建一個(gè)可以容納 250 個(gè) 6 個(gè)整數(shù)數(shù)組的通道,并draw()在 goroutine 中啟動(dòng)我的函數(shù)。runtime.GOMAXPROCS(2)ch := make(chan [6]int, 250)go draw(ch)接下來(lái),我[4 8 15 16 23 42]從頻道中取出一個(gè)獲勝的集合(例如),然后是一個(gè)“當(dāng)前”集合,意思是最近的平局。我將 game_played 計(jì)數(shù)器設(shè)置為 1:winning := <- chcurrent := <- chgames_played := 1這是棘手的一點(diǎn)。在無(wú)限循環(huán)中,我檢查當(dāng)前平局是否等于獲勝平局。如果是,我打印玩的游戲數(shù)量,并從循環(huán)中中斷。如果不是,我設(shè)置current為新的平局,并增加計(jì)數(shù)器。然后循環(huán)應(yīng)該if winning == current...一遍又一遍地運(yùn)行檢查,直到匹配為止。for { if winning == current { fmt.Println(games_played) break } else { current := <- ch games_played += 1 }}問(wèn)題是:倒數(shù)第四行,current := <- ch拋出編譯器錯(cuò)誤,“當(dāng)前已聲明但未使用”。我想說(shuō)“是的,我知道它在向下讀取之后不再使用,但它是在循環(huán)中聲明的,所以它的值在下一次迭代中很重要?!?但我不知道怎么做,或者我是否做了一些愚蠢的事情。顯然,我對(duì) Go 一無(wú)所知。但對(duì)我來(lái)說(shuō),仔細(xì)想想,邏輯是合理的。我搞砸了什么嗎?(注意:我知道抽簽[1 2 3]不等于的疏忽,暫時(shí)[2 3 1]忽略這一點(diǎn)。)
1 回答

侃侃無(wú)極
TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
第二個(gè)電流在if范圍內(nèi)。替換current := <- ch為current = <- ch(無(wú)冒號(hào))。使用時(shí),:=您current在嵌套范圍內(nèi)定義一個(gè)新變量。
if winning == current {
fmt.Println(games_played)
break
} else {
current := <- ch
games_played += 1
}
相當(dāng)于:
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 關(guān)注
- 204 瀏覽
添加回答
舉報(bào)
0/150
提交
取消