我想将一个结构字段插入到另一个结构中,而不必使用结构名。
我知道我能做到
type Person struct {
Name string
}
type User struct {
Person
Email, Password string
}
但它会产生以下结构:
user := User{Person: Person{Name: ""}, Email: "", Password: ""}
我该怎么做
type Person struct {
Name string
}
type User struct {
Name Person.Name // Here
Email, Password string
}
"像这样使用它"
user := User{Name: "", Email: "", Password: ""}
"这可能吗"
1条答案
按热度按时间fkvaft9z1#
简单地说,使用当前的语言实现是不行的。
当初始化一个常量时,你需要显式地(或者,换句话说:literal![sic])。由于
User
包含Person
,因此literalUser
必须包含literalPerson
,如您所示:但是,一旦您有了
User
类型的 * 变量 *,您就可以利用anonymous字段来设置(或获取)匿名Person
的Name
,其中包含User
:为什么Go让我做所有这些工作?
让我们想象一下,它是可能的初始化内部
Person
的方式,你正在寻找:现在让我们进一步想象一下,我们稍后修改了
User
结构体并 * 添加 * 了它自己的Name
字段:现在,您显然可以初始化新的
Name
字段:注意,这与之前初始化
User.Person.Name
的代码相同,但现在它正在初始化User.Name
。更多陷阱
类似这样的代码还隐藏着更多的陷阱。
首先,在
User
中添加Name
字段 * 已经 * 类似地“中断”了User
变量上对Name
的非限定引用:此外,由于只有一个匿名
Person
字段,User.Person.Name
字段在默认情况下作为“Name”字段被编组到JSON:如果添加了
Name
字段,则 this 是被编组为"Name"
的字段,而User.Person.Name
字段 * 根本 * 不被编组。您可能认为可以为
User.Person.Name
添加一个json
标记,例如但是 * 现在 *
Person
被编组为一个 * 对象 *,其中包含一个Name
字段:User
没有Name
字段 *,如果您试图更改匿名Person
的编组字段名,也会发生这种情况。简而言之:在structs* 中使用anonymous *structs作为“添加字段”的一种方式可能会有问题,而且很脆弱,应该尽量避免。