假设我有以下结构:
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 如何识别结构的“结构”以执行此逻辑,但使用嵌入式字段而不是标准字段是否会影响这一点?
最佳答案
非限定类型名称在嵌入时充当字段名称,因此您可以将嵌入值称为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
( try it )。如果你不想这样,那么分配指向的值,而不是指针:
*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
没有改变 ( try it )。
关于pointers - 分配嵌入的 Struct 类型值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52988285/