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

Board index Программирование GoLand

Description: Программирование на языке Go

#1by mexan » 22.01.2025, 21:43

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

Передача массива в функцию
В Go при передаче массива в функцию передается его копия.
То есть, любая модификация массива внутри функции не отразится на оригинальном массиве, который был передан в аргументе.
Code: Select all
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] (остался без изменений)
}

Передача слайса в функцию
Если передается слайс, то передается ссылка на данные, на которые указывает слайс. Это значит, что изменения, сделанные внутри функции, затронут оригинальные данные.
Code: Select all
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] (массив изменился)
}

Как передать массив по ссылке?
Если вы хотите работать с массивом, не создавая его копию, то можете передать указатель на массив. Указатель передается "по ссылке", поэтому изменения внутри функции сразу отразятся на оригинальном массиве:
Code: Select all
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] (массив изменился)
}
Image
mexan
Администратор
Reputation: 0
Posts: 179
Topics: 138

Return to GoLand

cron