Как передаются массивы и слайсы в Go: копия или ссылка?

  • Автор темы Автор темы mexan
  • Дата начала Дата начала
Сообщения
202
Реакции
0
Особенности
  1. Массив:
    • При передаче в функцию создается копия массива.
    • Чтобы передать массив по ссылке, используется указатель на массив *.
  2. Слайс:
    • Передается "по ссылке", то есть как указатель на внутренние данные.
    • Изменения в слайсе внутри функции также затрагивают оригинальные данные.

Передача массива в функцию
В Go при передаче массива в функцию передается его копия.
То есть, любая модификация массива внутри функции не отразится на оригинальном массиве, который был передан в аргументе.
Код:
package main

import "fmt"

func modifyArray(arr [3]int) {
    arr[0] = 42
}

func main() {
    original := [3]int{1, 2, 3}
    modifyArray(original)
    fmt.Println(original) // Вывод: [1 2 3] (остался без изменений)
}

Передача слайса в функцию
Если передается слайс, то передается ссылка на данные, на которые указывает слайс. Это значит, что изменения, сделанные внутри функции, затронут оригинальные данные.
Код:
package main

import "fmt"

func modifySlice(slice []int) {
    slice[0] = 42
}

func main() {
    original := []int{1, 2, 3}
    modifySlice(original)
    fmt.Println(original) // Вывод: [42 2 3] (массив изменился)
}

Как передать массив по ссылке?
Если вы хотите работать с массивом, не создавая его копию, то можете передать указатель на массив. Указатель передается "по ссылке", поэтому изменения внутри функции сразу отразятся на оригинальном массиве:
Код:
package main

import "fmt"

func modifyArray(arr *[3]int) {
    arr[0] = 42
}

func main() {
    original := [3]int{1, 2, 3}
    modifyArray(&original) // Передаем указатель на массив
    fmt.Println(original) // Вывод: [42 2 3] (массив изменился)
}
 
Назад
Сверху