Почему значение массива сохраняется прежним?
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]
}
Срез не хранит никаких данных, он просто описывает часть подлежащего массива.
Когда вы изменяете элемент среза, вы модифицируете соответствующий элемент его подлежащего массива, и другие срезы, которые совместно используют тот же подлежащий массив, увидят это изменение.
Читайте также:
- Массивы, срезы и строки: механика работы append в Golang
- Срезы в Golang: внутреннее устройство и использование
- Эффективный Go: срезы (slices)
Комментариев нет:
Отправить комментарий