Почему golang не выполняет правильную итерацию в моем цикле for с диапазоном?

Я не понимаю, почему следующий код не выводит повторяющееся значение.

test:= []int{0,1,2,3,4}
for i,v := range test{
  go func(){
    fmt.Println(i,v)
  }
}

Я думаю, он должен распечатать

0 0
1 1
2 2
3 3 
4 4

Но вместо этого он распечатал

4 4
4 4
4 4
4 4
4 4

person A-letubby    schedule 17.02.2014    source источник


Ответы (1)


Ваши горутины не фиксируют текущее значение переменных i и v, а скорее ссылаются на сами переменные. В этом случае 5 порожденных горутин не были запланированы до завершения цикла for, поэтому все распечатали последние значения i и v.

Если вы хотите зафиксировать текущие значения некоторых переменных для гоурутины, вы можете изменить код, чтобы он читал что-то вроде следующего:

go func(i, v int){
    fmt.Println(i,v)
}(i, v)

Теперь у каждой гурупрограммы есть собственная копия переменных, содержащих значение на момент ее создания.

person James Henstridge    schedule 17.02.2014
comment
О, спасибо, Джеймс! Пытался исправить почти час. Моя проблема решена. - person A-letubby; 17.02.2014