Поля структуры не обновляются, когда другой объект сообщает об обновлении структуры - PullRequest
0 голосов
/ 19 марта 2019

У меня есть следующий struct, который имеет функцию, которая может обновлять свои поля:

type Dog struct {
    name string
    age  int
}

func (dog *Dog) growOld() {    
    dog.name = "old dog"
    dog.age++
}

Вышеописанное прекрасно работает само по себе. Однако, когда struct принадлежит другому объекту, и указанный объект сообщает struct обновить его поля, изменения, похоже, происходят, но не применяются:

package main

import (
    "fmt"
)

type Owner struct {
    dog Dog
}

func newOwner(dog Dog) Owner {
    var owner Owner
    owner.dog = dog

    return owner
}

func (owner Owner) tellDogToGrowOld() {
    owner.dog.growOld()
}

func main() {
    var dog Dog
    dog.name = "dog"

    owner := newOwner(dog)
    owner.tellDogToGrowOld()       

    fmt.Println(dog) // dog's name is still `dog` and age is 0.
}

Я предполагаю, что должен как-то использовать pointers, но не могу понять, как.

Ответы [ 2 ]

4 голосов
/ 19 марта 2019

Тип получателя метода должен быть указателем, если вы хотите, чтобы этот метод изменил состояние получателя.

То есть, так же, как вы объявили метод growOld, *У метода 1004 * также должен быть указатель:

func (owner *Owner) tellDogToGrowOld() {
    owner.dog.growOld()
}

В качестве альтернативы вы можете сделать поле, которое вы хотите изменить, указателем, например:

type Owner struct {
    dog *Dog
}

func newOwner(dog *Dog) Owner {
    var owner Owner
    owner.dog = dog

    return owner
}

func (owner Owner) tellDogToGrowOld() {
    owner.dog.growOld()
}
3 голосов
/ 19 марта 2019

Установите в поле «Владелец» значение «Собака, а не собака»

type Owner struct {
    dog *Dog
}

func newOwner(dog *Dog) Owner {
    var owner Owner
    owner.dog = dog

    return owner
}

при вызове основного пользователя и собаки

var dog Dog
    dog.name = "dog"

    owner := newOwner(&dog)

https://play.golang.org/p/LpFqW09dOs4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...