Sobes.tech
Назад к вопросам
Senior
6

func main() { a := make([]int, 0, 3) a = append(a, 1) a = append(a, 2) add(a) fmt.Printf("%v", a) // } func add(a []int) { a = append(a, 3) a = append(a, 4) }

Компании, где спрашивали
техвил

Ответ от нейросети

sobes.tech AI

В данном примере срез a создаётся с длиной 0 и ёмкостью 3. В main добавляются элементы 1 и 2, после чего вызывается функция add(a). Внутри add происходит добавление элементов 3 и 4 в срез a, но это локальная копия среза, переданная по значению.

В Go срезы — это структура, содержащая указатель на массив, длину и ёмкость. При передаче среза в функцию копируется структура среза, но не сам массив. Изменения элементов массива внутри функции будут видны снаружи, но операции, изменяющие длину среза (например, append), которые приводят к изменению структуры среза, не повлияют на срез в вызывающей функции, если не вернуть новый срез или не передать указатель.

В данном случае add изменяет локальную копию среза, но не возвращает её, поэтому в main срез a останется равен [1 2].

Пример вывода:

[1 2]

Если нужно, чтобы изменения в add были видны в main, можно:

  • Возвращать новый срез из add и присваивать его в main.
  • Передавать указатель на срез.

Пример с возвратом:

func add(a []int) []int {
    a = append(a, 3)
    a = append(a, 4)
    return a
}

func main() {
    a := make([]int, 0, 3)
    a = append(a, 1, 2)
    a = add(a)
    fmt.Printf("%v", a) // [1 2 3 4]
}