可憐的標題,但我不知道如何在字符限制內描述它。'聲明和不使用',因爲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),
}
}
}
然後在main()
我指定兩個OS線程,創建可以容納一個信道250個6位數組,並在goroutine中啓動我的draw()
函數。
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]
的,忽略了現在)
[參見](http://stackoverflow.com/q/5029819/720999)。 – kostix