воскресенье, 17 мая 2020 г.

Массив не изменится

Почему значение массива сохраняется прежним?

func Foo(a [2]int) {
    a[0] = 8
}

func main() {
    a := [2]int{1, 2}
    Foo(a)         // Попытка изменить a[0].
    fmt.Println(a) // Вывод: [1 2]
}

Ответ

  • Массивы в Go являются значениями.
  • Когда вы передаете массив функции, массив копируется.

Если вы хотите, чтобы Foo обновлял элементы a, используйте вместо этого срез.

func Foo(a []int) {
    if len(a) > 0 {
        a[0] = 8
    }
}

func main() {
    a := []int{1, 2}
    Foo(a)         // Изменяем a[0].
    fmt.Println(a) // Вывод: [8 2]
}

Срез не хранит никаких данных, он просто описывает часть подлежащего массива.

Когда вы изменяете элемент среза, вы модифицируете соответствующий элемент его подлежащего массива, и другие срезы, которые совместно используют тот же подлежащий массив, увидят это изменение.


Читайте также:


Комментариев нет:

Отправить комментарий