Назначение встроенных значений типа Struct - PullRequest
0 голосов
/ 25 октября 2018

Предположим, у меня есть следующая структура:

type X struct{
    Name string
    Age int
    Email string
}

, а затем у меня есть 2 другие структуры (подклассы):

type A struct{
    *X
}

type B struct{
    *X
}

Тогда в моем основном коде у меня есть:

a := A{&X{"John", 34, "jd@email.com"}}
b := B{&X{"Greg", 22, "gd@email.com"}}
fmt.Println(a.Name) // John
fmt.Println(b.Name) //Greg

Существует ли простой способ присвоения a=b такой, что a.Name возвращает Greg, а также все другие свойства (я не хочу назначать их по отдельности, потому что есть куча свойств)

Примечание : я должен сделать это следующим образом, так как у меня есть две идентичные таблицы базы данных (с точки зрения их свойств), и ORM, который я использую, основывает целевую таблицу на имени структуры.Говоря о том, что я не уверен, как ORM определяет «структуру» структуры для выполнения этой логики, но влияет ли на это использование встроенных полей вместо стандартных полей?

1 Ответ

0 голосов
/ 25 октября 2018

Неквалифицированное имя типа действует как имя поля при встраивании, поэтому вы можете ссылаться на внедренное значение как a.X и b.X.

Вы также можете назначить одно другому:

a.X = b.X
fmt.Println(a.Name) // Greg
fmt.Println(b.Name) // Greg

После этого оба будут печатать Greg.Попробуйте это на Go Playground .

Одна вещь, которую нужно отметить здесь.Поскольку ваши структуры встраивают указатель, вышеуказанное присваивание a.X = b.X присваивает значение указателя.Таким образом, после того, как вышеупомянутые модифицирующие поля одного из них будут влиять на другое.

Итак, продолжая приведенный выше пример:

a.X.Name = "Bob"
fmt.Println(a.Name) // Bob
fmt.Println(b.Name) // Bob

Оба имени изменены на Bob (, попробуйте ).Если вы не хотите этого, тогда присвойте указанным значениям, а не указателям:

*a.X = *b.X
fmt.Println(a.Name) // Greg
fmt.Println(b.Name) // Greg

Это снова напечатает Greg дважды.Попробуйте на Go Playground .

А теперь, если вы сделаете это:

a.X.Name = "Bob"
fmt.Println(a.Name) // Bob
fmt.Println(b.Name) // Greg

Только a.Name изменилось, но не b.Name (попробуйте ).

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