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>