Проблема в том, что, используя ваш первый цикл for / range, вы получаете значение struct by-value в переменной a
.Второй цикл for / range, который вы использовали, решает проблему, напрямую обращаясь к памяти в срезе.
Однако вы неверно утверждаете, что во втором цикле for происходит «дополнительный» поиск.Условие цикла просто собирается проверить длину среза и увеличивать счетчик до тех пор, пока он не достигнет конца.Затем выражение accounts[a]
будет фактически выполнять поиск в массиве и напрямую манипулировать памятью.Во всяком случае, второй цикл for преобразуется в меньшее количество инструкций, поскольку он не копирует содержимое struct by-value в первую очередь.
Я думаю, что вас беспокоит то, что вам нужно сослаться на accounts[i]
каждый раз.Если вы хотите выполнить несколько манипуляций с учетной записью внутри цикла for, я думаю, что наилучший способ ее решения будет выглядеть следующим образом:
for i := range accounts {
a := &accounts[i]
a.balance = 100
// manipulate account A further...
}
Другое возможное решение, как предложила Мью, это просто иметьломтик держит указатели.Есть преимущества у любого из способов сделать это, но дилемма одна и та же, независимо от того, находитесь ли вы в C или Go.Иди просто немного больше синтаксического сахара.