我有一个RegistrationRequest结构:
type RegistrationRequest struct { Email *string Email2 *string Username *string Password *string Name string }
Email2再次在哪里输入电子邮件值,以验证用户输入的内容正确无误。
Email2
我也有一个用户结构:
type User struct { Email *string Username *string Password *string Name string }
当然,没有必要存储Email2超出注册的范围。
所以我有两个变量:req和u-每个结构一个。是否可以将req结构分配给该u结构,以便所有公共字段都将存在于该u结构中?
req
u
使用简单分配,您不能这样做,因为即使的字段User是的子集RegistrationRequest,它们也完全是2种不同的类型,并且可分配性规则不适用。
User
RegistrationRequest
您可以编写一个使用反射(reflect包)的函数,并将所有字段从复制req到u,但这很丑陋(且效率低下)。
reflect
最好是重构您的类型,并RegistrationRequest可以嵌入 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,将复制指针值而不是指针值。我不确定为什么在这里需要指针,最好将所有字段声明为非指针。
struct
还要注意,嵌入并不是真正的要求,它只是使您的类型及其用法更加平滑。User也可能是的“普通”字段RequistrationRequest,例如:
RequistrationRequest
type RegistrationRequest struct { Usr User // This is just an ordinary field, not embedding Email2 *string }