Как изменится производительность при передаче в функцию слайса из 1 элемента по сравнению со слайсом из 1000 элементов?

Ответ

Производительность не изменится. При передаче слайса в функцию в Go по значению копируется только его заголовок, а не все его элементы.

Что такое заголовок слайса?

Слайс в Go — это легковесная структура, которая описывает непрерывный участок базового массива. Его заголовок (runtime.SliceHeader) состоит из трёх полей:

  1. Указатель на первый элемент базового массива.
  2. Длина (length) — количество элементов в слайсе.
  3. Ёмкость (capacity) — количество элементов от начала слайса до конца базового массива.

На 64-битной системе размер этого заголовка фиксирован и составляет 24 байта (8 байт на каждое поле). Именно эти 24 байта и копируются при передаче слайса в функцию, независимо от того, сколько элементов он содержит — один или тысячу.

// s1 и s2 имеют разную длину, но их заголовки занимают одинаковый размер.
var s1 []int = make([]int, 1)
var s2 []int = make([]int, 1000)

// В обоих случаях в функцию копируется только 24-байтный заголовок.
processSlice(s1)
processSlice(s2)

Важное отличие от массива:

Если бы вместо слайса передавался массив, ситуация была бы кардинально другой. При передаче массива в функцию копируются все его элементы.

func processArray(arr [1000]int) { 
    // Сюда будет скопировано 1000 * 8 = 8000 байт данных
}

Вывод:
Передача слайса в функцию — это очень быстрая операция, стоимость которой не зависит от количества элементов в слайсе. Так как передается указатель на данные, изменения элементов слайса внутри функции будут видны снаружи.