分配嵌入的 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.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)。
假设我有以下结构:
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.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)。