В чём разница между передачей массива и передачей слайса в функцию

«В чём разница между передачей массива и передачей слайса в функцию» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При передаче массива в функцию он копируется целиком, что может быть неэффективно для больших массивов. Слайс же передаётся по ссылке (под капотом передаётся структура с указателем на массив, длиной и ёмкостью).

Пример:

func modifyArray(arr [3]int) {
    arr[0] = 100 // изменяется только копия
}

func modifySlice(s []int) {
    s[0] = 100 // изменяется оригинальный массив
}

func main() {
    arr := [3]int{1, 2, 3}
    sl := []int{1, 2, 3}

    modifyArray(arr) // arr не изменится
    modifySlice(sl)  // sl изменится
}

Ключевые отличия:

  • Массивы передаются по значению (копируются)
  • Слайсы передаются по ссылке (эффективно)
  • Изменения в функции влияют на оригинальный слайс, но не на массив