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>, если они должны жить дольше области действия функции. Поэтому &User{...} - безопасно: компилятор гарантирует, что указатель не станет висячим (dangling pointer).</p>
13
<p>Go автоматически размещает значения в<strong>куче</strong>, если они должны жить дольше области действия функции. Поэтому &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>