在PHP的开发中,经常会遇到在一个结构体中使用另一个结构体字段的情况。然而,直接将其引用为键可能会造成代码的混乱和不易维护。那么如何在另一个结构体中使用结构体字段呢?php小编百草为大家提供了一种简洁明了的解决方案,让你的代码更加清晰和易读。下面就让我们一起来看看吧!
问题内容
我想将一个结构体字段插入到另一个结构体中,而不必使用结构体名称。
我知道我能做到这一点:
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: ""}
可能吗?
解决方法
简单地说,使用当前的语言实现是做不到的。
初始化文字时,您需要明确(或者,换句话说:文字![原文如此])。由于 user
包含 person
,因此文字 user
必须包含文字 person
,如下所示:
u := user{
person: person{
name: "bob",
},
email: "[email protected]",
password: "you're kidding right?",
}
但是,一旦您拥有 user
类型的变量,您就可以利用匿名字段通过 user
设置(或获取)匿名 person
的 name
:
u := user{}
u.name = "bob"
u.email = "[email protected]",
u.password = "you're kidding right?",
为什么 go 让我做所有这些工作?
让我们想象一下,可以按照您正在寻找的方式初始化内部 person
:
u := user{ name: "bob" }
现在让我们进一步想象一下,我们稍后修改 user
结构并添加它自己的 name
字段:
type user struct {
person
name string
email string
password string
}
现在您可以显然初始化新的 name
字段:
u := user{ name: "bob" }
请注意,这与之前初始化 user.person.name
的代码相同,但现在它正在初始化 user.name
。不好。
更多问题
这样的代码还潜藏着更多的陷阱。
首先,在 user
中添加 name
字段已经类似地“破坏”了 user
变量上对 name
的非限定引用:
u.name = "bob" // used to set user.person.name, now sets user.name
此外,仅使用匿名 person
字段,user.person.name
字段默认编组为 json 作为“名称”字段:
{
"name": "",
"email": "",
"password": ""
}
如果添加了 name
字段,则 this 是编组为 "name"
的字段,并且 user.person.name
字段根本不编组 >.
您可能认为可以为 user.person.name
添加 json
标签,例如
type user struct {
person `json:"personname"`
name string
email string
password string
}
但是现在 person
被编组为带有 name
字段的对象:
{
"PersonName": {
"Name": ""
},
"Name": "",
"Email": "",
"Password": ""
}
如果您尝试更改匿名 person
的编组字段名称,即使 user
没有 name
字段,也会发生这种情况。
简而言之:在结构中使用匿名结构作为“添加字段”的方式可能存在问题且脆弱,应该避免。
以上就是如何在另一个结构体中使用结构体字段而不将其引用为键的详细内容,更多请关注编程网其它相关文章!