pointers - 分配嵌入的 Struct 类型值

标签 pointers go struct embedding

假设我有以下结构:

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/

相关文章:

go - 测试无法捕获日志输出

c - 为什么我的结构必须声明为指针?

c - 戈朗 : pack a struct

c++ - 在链表中删除该节点时,节点*接下来会发生什么?

C 指针 - 非常基本的

go - 无法安装 gotk3,出现 GdkMonitor 错误

在 C 中编译 md5 校验和但出现编译错误

c - 动态内存分配代码解释

c - 取消引用指向整个数组的指针

go - &http.Client 在 Golang 中,需要解释