HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Срезы в Go - это лёгкие структуры, содержащие указатель на базовый массив, длину (len) и вместимость (cap). При передаче в функцию срез копируется<strong>как структура</strong>, но оба среза продолжают указывать на один и тот же массив. Это поведение важно для понимания того, когда изменения внутри функции отражаются на исходных данных, а когда нет.</p>
1 <p>Срезы в Go - это лёгкие структуры, содержащие указатель на базовый массив, длину (len) и вместимость (cap). При передаче в функцию срез копируется<strong>как структура</strong>, но оба среза продолжают указывать на один и тот же массив. Это поведение важно для понимания того, когда изменения внутри функции отражаются на исходных данных, а когда нет.</p>
2 <h2>Передача срезов</h2>
2 <h2>Передача срезов</h2>
3 <p>При передаче среза в функцию изменения элементов видны снаружи, потому что копируется только структура, а не массив.</p>
3 <p>При передаче среза в функцию изменения элементов видны снаружи, потому что копируется только структура, а не массив.</p>
4 <p>Здесь функция modify() изменила первый элемент, и изменение видно в main().</p>
4 <p>Здесь функция modify() изменила первый элемент, и изменение видно в main().</p>
5 <h2>Вызов append() внутри функции</h2>
5 <h2>Вызов append() внутри функции</h2>
6 <p>При использовании append() поведение зависит от вместимости исходного среза:</p>
6 <p>При использовании append() поведение зависит от вместимости исходного среза:</p>
7 <ul><li>Если append() помещается в существующий массив, изменения видны снаружи.</li>
7 <ul><li>Если append() помещается в существующий массив, изменения видны снаружи.</li>
8 <li>Если append() создаёт новый массив (переполнена cap), изменения не будут видны, если не вернуть новый срез.</li>
8 <li>Если append() создаёт новый массив (переполнена cap), изменения не будут видны, если не вернуть новый срез.</li>
9 </ul><p>Чтобы изменения сохранились, возвращаем срез из функции:</p>
9 </ul><p>Чтобы изменения сохранились, возвращаем срез из функции:</p>
10 <h2>Возврат срезов</h2>
10 <h2>Возврат срезов</h2>
11 <p>Возвращение срезов из функций безопасно: копируется только структура, а массив остаётся в памяти столько, сколько нужен.</p>
11 <p>Возвращение срезов из функций безопасно: копируется только структура, а массив остаётся в памяти столько, сколько нужен.</p>
12 <h2>Под-срезы и утечки памяти</h2>
12 <h2>Под-срезы и утечки памяти</h2>
13 <p>Если взять под-срез большого массива, он продолжит удерживать в памяти весь массив, даже если используется только часть данных.</p>
13 <p>Если взять под-срез большого массива, он продолжит удерживать в памяти весь массив, даже если используется только часть данных.</p>
14 <p>Чтобы освободить неиспользуемую память, можно сделать копию:</p>
14 <p>Чтобы освободить неиспользуемую память, можно сделать копию:</p>
15 <h2>Вывод</h2>
15 <h2>Вывод</h2>
16 <ul><li>Срезы передаются по значению, но содержат указатель на общий массив.</li>
16 <ul><li>Срезы передаются по значению, но содержат указатель на общий массив.</li>
17 <li>Изменения элементов внутри функции видны снаружи.</li>
17 <li>Изменения элементов внутри функции видны снаружи.</li>
18 <li>При использовании append() новый срез может указывать на другой массив - его нужно возвращать.</li>
18 <li>При использовании append() новый срез может указывать на другой массив - его нужно возвращать.</li>
19 <li>Возврат срезов безопасен, но под-срезы больших массивов могут удерживать память, которую стоит освобождать через копирование.</li>
19 <li>Возврат срезов безопасен, но под-срезы больших массивов могут удерживать память, которую стоит освобождать через копирование.</li>
20 <li>Чтобы избежать утечки памяти, скопируйте нужную часть среза, например через slices.Clone().</li>
20 <li>Чтобы избежать утечки памяти, скопируйте нужную часть среза, например через slices.Clone().</li>
21 </ul>
21 </ul>