分配嵌入的 Struct 类型值

Assigning embedded Struct type values

假设我有以下结构:

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 returns Greg 以及所有其他属性(我不想分配它们单独因为有一堆属性)

注意:我必须这样做,因为我有两个相同的数据库 tables(根据它们的属性)和我正在使用的 ORM将目标 table 基于结构名称。说到,我不确定 ORM 如何识别结构的 "structure" 来执行此逻辑,但是使用嵌入式字段而不是标准字段会影响这个吗?

不合格的类型名称作为嵌入时的字段名称,因此您可以将嵌入值称为a.Xb.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)。