在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
类型的变量,您就可以利用匿名字段通过user
设置(或获取)匿名person
的name
变量
user
设置(或获取)匿名
u := user{} u.name = "bob" u.email = "[email protected]", u.password = "you're kidding right?",
person
为什么 go 让我做所有这些工作?
让我们想象一下,可以按照您正在寻找的方式初始化内部user
结构并添加它自己的name
:
u := user{ name: "bob" }
现在让我们进一步想象一下,我们稍后修改user
结构并添加它自己的name
字段:
type user struct { person name string email string password string }
现在您user.person.name
的代码相同,但现在它正在初始化user.name
可以
u := user{ name: "bob" }
请注意,这与之前初始化
。不好。user
中添加name
字段已经类似地“破坏”了user
变量上对name
更多问题
这样的代码还潜藏着更多的陷阱。person
字段,user.person.name
user
中添加
字段name
字段,则this是编组为"name"
的字段,并且user.person.name
已经类似地“破坏”了user
变量上对的非限定引用:
u.name = "bob" // used to set user.person.name, now sets user.name
此外,仅使用匿名user.person.name
添加json
字段,user.person.name
字段默认编组为 json 作为“名称”字段:
{ "name": "", "email": "", "password": "" }
如果添加了字段,则thisperson
被编组为带有name
是编组为"name"
的字段,并且user.person.name
字段根本不编组>.
您可能认为可以为标签,例如person
的编组字段名称,即使user
没有name
type user struct { person `json:"personname"` name string email string password string }
{ "PersonName": { "Name": "" }, "Name": "", "Email": "", "Password": "" }
user
没有 字段,也会发生这种情况。 简而言之:在结构中使用匿名结构作为“添加字段”的方式可能存在问题且脆弱,应该避免。
以上是如何在另一个结构体中使用结构体字段而不将其引用为键的详细内容。更多信息请关注PHP中文网其他相关文章!