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