Ответ
Производительность не изменится. При передаче слайса в функцию в Go по значению копируется только его заголовок, а не все его элементы.
Что такое заголовок слайса?
Слайс в Go — это легковесная структура, которая описывает непрерывный участок базового массива. Его заголовок (runtime.SliceHeader
) состоит из трёх полей:
- Указатель на первый элемент базового массива.
- Длина (length) — количество элементов в слайсе.
- Ёмкость (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 байт данных
}
Вывод:
Передача слайса в функцию — это очень быстрая операция, стоимость которой не зависит от количества элементов в слайсе. Так как передается указатель на данные, изменения элементов слайса внутри функции будут видны снаружи.