@kinojs
Начинающий разрабочтик, WEB

Есть ли подводные камни в использовании ссылок Golang в горутинах?

Здравствуйте. Есть такой код, в котором я прохожусь по элементам в списке, используя эти элементы в горутине, которую запускаю внутри цикла. Я хочу безопасно передавать значение в горутину, но открыл для себя особенность, что если передавать ссылку в горутину, в горутине будет самое последнее значение переменной в цикле (если прошло достаточно времени и цикл успел завершиться до обращения к ссылке).

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

Код - https://play.golang.com/p/5phJY4x5Yaf

В результате выполнения кода, будет видно, что в случае использования ссылок - под каждым i будет выводится 0 - значение последнего элемента в списке. Если без ссылок - то все ок
  • Вопрос задан
  • 203 просмотра
Решения вопроса 1
@Zolg
но открыл для себя особенность, что если передавать ссылку в горутину, в горутине будет самое последнее значение переменной в цикле
это не 'особенность', это основная фича ссылок. В любом ЯП.

Сама переменная - это некоторая область в памяти, в которой записано то, что в этой переменной содержится.
При передаче параметра по значению ('без ссылок') создается еще одна такая же область в памяти, куда копируется содержимое исходной переменной. И код вызванной функции работает уже со своей копией.

При передаче параметра по указателю ('с сылками') копия переменной не создается, а в вызываемую функцию передается адрес (указатель, ссылка) области памяти в которой лежат оригинальная переменная. И вызванная функция работает уже с ним.

Очевидно, что когда два куска кода одновременно могут писать читать в одно и то же место памяти - они мгновенно 'видят' изменения, вносимые каждым.

И, естественно, в общем случае без дополнительных усилий это не thread/goroutine/etc. safe. Причем в случае, если сама переменная - что-то посложнее int, то эффект от такой одновременной работы может быть гораздо более занятным, чем просто изменение значения.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы