HTML Diff
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>