gpt4 book ai didi

pointers - 分配嵌入的 Struct 类型值

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:23 25 4
gpt4 key购买 nike

假设我有以下结构:

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.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 )。

关于pointers - 分配嵌入的 Struct 类型值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52988285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com