我有一个 RegistrationRequest 结构:
type RegistrationRequest struct {
Email *string
Email2 *string
Username *string
Password *string
Name string
}
其中 Email2
是再次输入的电子邮件值,以验证用户输入的内容是否正确。
我还有一个用户结构:
type User struct {
Email *string
Username *string
Password *string
Name string
}
当然,除了注册之外,不需要存储Email2
。
所以我有两个变量:req
和 u
- 每个结构一个。是否可以将 req
结构分配给 u
结构,以便所有公共(public)字段都将存在于 u
结构中?
最佳答案
使用简单 assignment你不能,因为尽管 User
的字段是 RegistrationRequest
的子集,但它们完全是两种不同的类型,并且 Assignability规则不适用。
您可以编写一个使用反射(reflect
包)的函数,并将所有字段从 req
复制到 u
,但这很丑陋(而且效率低下)。
最好重构您的类型,RegistrationRequest
可以 embed 用户
。
如果您有一个 RegistrationRequest
类型的值,那么这样做意味着您已经有一个 User
的值:
type User struct {
Email *string
Username *string
Password *string
Name string
}
type RegistrationRequest struct {
User // Embedding User type
Email2 *string
}
func main() {
req := RegistrationRequest{}
s := "as@as.com"
req.Email = &s
s2 := "testuser"
req.Username = &s2
u := User{}
u = req.User
fmt.Println(*u.Username, *u.Email)
}
输出:(在 Go Playground 上尝试)
testuser as@as.com
另请注意,由于您的结构包含指针,因此在复制 struct
时,将复制指针值而不是指针值。我不确定为什么您需要此处的指针,最好将所有字段声明为非指针。
另请注意,嵌入并不是真正的要求,它只是让您的类型及其使用更加顺畅。 User
也可以是 RequistrationRequest
的“普通”字段,例如:
type RegistrationRequest struct {
Usr User // This is just an ordinary field, not embedding
Email2 *string
}
关于struct - 将结构分配给另一个结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53665398/