Как работает и в чем особенности встроенной функции `copy` в Go?

Ответ

Встроенная функция copy копирует элементы из исходного слайса (src) в целевой слайс (dst). Она не создает новый слайс, а работает с уже выделенной памятью.

Сигнатура: func copy(dst, src []Type) int

Ключевые особенности:

  1. Возвращаемое значение: Возвращает количество скопированных элементов. Это число равно минимуму из длин len(dst) и len(src).
  2. Память не выделяется: copy не изменяет длину или вместимость целевого слайса. Если len(dst) меньше len(src), будут скопированы только первые len(dst) элементов.
  3. Безопасность при пересечении: copy корректно обрабатывает случаи, когда dst и src указывают на одну и ту же область памяти (пересекаются).
  4. Работа со слайсами: Аргументами функции должны быть слайсы. Чтобы скопировать из/в массив, нужно сначала получить из него слайс (например, array[:]).
  5. Работа с nil: Копирование в nil-слайс или из него безопасно и ничего не делает, возвращая 0.

Пример:

src := []int{10, 20, 30, 40} // len=4
dst := make([]int, 2)       // len=2

numCopied := copy(dst, src)

// Результат:
// numCopied = 2 (минимум из 4 и 2)
// dst = [10, 20] (только 2 элемента поместилось)
// src = [10, 20, 30, 40] (исходный слайс не изменился)