我有一个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
的子集,它们完全是2种不同的类型,并且Assignability规则不适用。
您可以编写一个使用反射的函数( reflect
包),并将所有字段从req
复制到u
,但这很丑陋(且效率低下)。
最好是重构您的类型,RegistrationRequest
可以embed User
。
如果您具有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/59090638/