wg.Add(5)
for i := 0; i < 5; i++ {
go func() {
defer wg.Done()
log.Println(i, &i)
}()
}
wg.Wait()
}
Вывод:
5 0xc000102068
5 0xc000102068
5 0xc000102068
5 0xc000102068
3 0xc000102068
Как так получается, что 3 выводится в конце?
https://go.dev/blog/loopvar-preview
хз что у тебя там, у меня все пятерки при выполнении кода
надо несколько раз запустить
каждый раз одно и то же
много-много раз надо
значит какой-то раз цикл не успевает дойти до конца и выполняется уже log.Println
крч типо какой-то баг, который будет исправлен в 1.22 версии?
Это нормальное поведение для го, которое хотят поменять в 1.22
сразу пару линтеров выкину, кайф :)
https://go.dev/play/p/fez9Ppf_i_N
но это не объясняет, почему 3 последней вывелась т.е. они просто хотят добавить, чтобы на каждой итерации была своя переменная i
это же горутины, там нет никакого "стабильного" порядка
вот как я читал эту программу: 1. пошел цикл 2. горутины закинулись в планировщик 3. цикл закончился 4. после чего пошло выполнение горутин 5. все они выводят 5, т.к. после завершения цикла, последнее значение i было 5. И все они выводят один и тот же i как можно заметить по выведенному адресу но, последняя горутина почему-то выводит 3
Обычно линтеры ругаются на шедоуинг
последняя запустилась возможно раньше когда еще счетчик был 3, но сам принтл отработал медленее и поэтому вывелся последним
почему последняя? потому что 3 в конце вывела?
хммммммммммммммммммммм
Это просто пример никто не мешает сделать так go func(index int) { defer wg.Done() log.Println(index, &index) }(i)
все, разобрался
Обсуждают сегодня