HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В Go структура (struct) - это значение. Это означает, что при передаче или возврате структуры из функции она<strong>копируется</strong>. Такое поведение важно учитывать, особенно если структура большая или содержит поля, указывающие на изменяемые данные.</p>
1 <p>В Go структура (struct) - это значение. Это означает, что при передаче или возврате структуры из функции она<strong>копируется</strong>. Такое поведение важно учитывать, особенно если структура большая или содержит поля, указывающие на изменяемые данные.</p>
2 <h2>Возврат структуры по значению</h2>
2 <h2>Возврат структуры по значению</h2>
3 <p>Вы можете напрямую возвращать структуру из функции:</p>
3 <p>Вы можете напрямую возвращать структуру из функции:</p>
4 <p>Здесь возвращается<strong>копия</strong>структуры User. Все поля копируются, и дальнейшие изменения переменной user в main() не затронут оригинальный объект, созданный внутри NewUser.</p>
4 <p>Здесь возвращается<strong>копия</strong>структуры User. Все поля копируются, и дальнейшие изменения переменной user в main() не затронут оригинальный объект, созданный внутри NewUser.</p>
5 <h2>Возврат указателя на структуру</h2>
5 <h2>Возврат указателя на структуру</h2>
6 <p>Иногда вместо копии удобнее вернуть<strong>указатель</strong>на структуру:</p>
6 <p>Иногда вместо копии удобнее вернуть<strong>указатель</strong>на структуру:</p>
7 <p>Такой подход даёт:</p>
7 <p>Такой подход даёт:</p>
8 <ul><li>Возможность изменять поля структуры вне функции.</li>
8 <ul><li>Возможность изменять поля структуры вне функции.</li>
9 <li>Экономию памяти (особенно при работе с большими структурами).</li>
9 <li>Экономию памяти (особенно при работе с большими структурами).</li>
10 <li>Консистентность в стиле, если структура часто используется по ссылке.</li>
10 <li>Консистентность в стиле, если структура часто используется по ссылке.</li>
11 </ul><p>Пример:</p>
11 </ul><p>Пример:</p>
12 <h2>Безопасность возврата указателя</h2>
12 <h2>Безопасность возврата указателя</h2>
13 <p>Go автоматически размещает значения в<strong>куче</strong>, если они должны жить дольше области действия функции. Поэтому &amp;User{...} - безопасно: компилятор гарантирует, что указатель не станет висячим (dangling pointer).</p>
13 <p>Go автоматически размещает значения в<strong>куче</strong>, если они должны жить дольше области действия функции. Поэтому &amp;User{...} - безопасно: компилятор гарантирует, что указатель не станет висячим (dangling pointer).</p>
14 <h2>Когда использовать что?</h2>
14 <h2>Когда использовать что?</h2>
15 <ul><li>Возвращайте<strong>по значению</strong>, если структура небольшая и вы не планируете её менять.</li>
15 <ul><li>Возвращайте<strong>по значению</strong>, если структура небольшая и вы не планируете её менять.</li>
16 <li>Возвращайте<strong>указатель</strong>, если:<ul><li>Структура содержит изменяемое состояние.</li>
16 <li>Возвращайте<strong>указатель</strong>, если:<ul><li>Структура содержит изменяемое состояние.</li>
17 <li>Нужно избежать лишнего копирования.</li>
17 <li>Нужно избежать лишнего копирования.</li>
18 <li>Вы хотите единообразие с методами, использующими указатель-приёмник.</li>
18 <li>Вы хотите единообразие с методами, использующими указатель-приёмник.</li>
19 </ul></li>
19 </ul></li>
20 </ul><h2>Рекомендуемые программы</h2>
20 </ul><h2>Рекомендуемые программы</h2>