Почему при использовании указателя не меняются данные Golang
Работаю с указателями в GO. Если я правильно понял то указатели несут в себе участок памяти, в котором хранится значение. Значит при изменении этого участка памяти значение должно меняться везде (как я понимаю). Написал такой код:
package main
import (
"errors"
"fmt"
)
type Animal struct {
ID int
Name string
}
type Zoo struct {
Animals []Animal
}
func (z *Zoo) FindAnimal(id int) (*Animal, error) {
for _, animal := range z.Animals {
if animal.ID == id {
return &animal, nil
}
}
return nil, errors.New("Animal not found")
}
func main() {
zoo := Zoo{
Animals: []Animal{
Animal{ID: 1, Name: "Monkey"},
Animal{ID: 2, Name: "Tiger"},
Animal{ID: 3, Name: "Wolf"},
},
}
animal, err := zoo.FindAnimal(2)
if err != nil {
panic(err)
} else {
fmt.Println(animal) // &{2 Tiger}
}
animal.Name = "NewName"
newAnimal, err := zoo.FindAnimal(2)
if err != nil {
panic(err)
} else {
fmt.Println(newAnimal) // &{2 Tiger}
}
}
Я передаю указатель на экземпляр структуры Animal в функции FindAnimal. Я ожидаю что при изменении данных этого указателя данные будут так же меняться в экземпляре структуры Zoo, но этого почему то не происходит. Почему так? И что мне нужно поменять, чтобы это работало так, как я хочу
Ответы (1 шт):
Через 5 минут после публикации понял в чём проблема. Проблема в цикле, он когда достаёт значение из массива, то дублирует их, создавая новый участок памяти, соответственно меняться будет он, а не то что в массиве, решением стало изменить цикл так:
for i := 0; i < len(z.Animals); i++ {
if z.Animals[i].ID == id {
return &z.Animals[i], nil
}
}