2016-01-25 16 views
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), 
     } 
    } 
} 

然後在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]的,忽略了現在)

+0

[參見](http://stackoverflow.com/q/5029819/720999)。 – kostix

回答

6

第二電流是在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 
}