Неквалифицированное имя типа действует как имя поля при встраивании, поэтому вы можете ссылаться на внедренное значение как 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
(попробуйте ).