分配嵌入式Struct类型值

时间:2018-10-25 11:32:30

标签: pointers go struct embedding

假设我具有以下结构:

# Add this line in jsp page # 
<tr><td>Email</td><td><input name="email" required></td></tr>
# Modify this line # 
String em = String.valueOf(request.getAttribute("email"));
# Change with this code #
String em = request.getParameter("email");

#Kindly modify this and add condition like above answer.#

然后我还有其他2个结构(子类):

type X struct{
    Name string
    Age int
    Email string
}

然后在我的主要代码中,我有:

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

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

1 个答案:

答案 0 :(得分:1)

嵌入时,非限定类型名称用作字段名称,因此您可以将嵌入值称为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

两个名称均更改为Bobtry 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.Nametry it)发生变化。