为结构分配另一个结构
我有一个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
结构,以便所有公共字段都将存在于该u
结构中?
回答:
使用简单分配,您不能这样做,因为即使的字段User
是的子集RegistrationRequest
,它们也完全是2种不同的类型,并且可分配性规则不适用。
您可以编写一个使用反射(reflect
包)的函数,并将所有字段从复制req
到u
,但这很丑陋(且效率低下)。
最好是重构您的类型,并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
,将复制指针值而不是指针值。我不确定为什么在这里需要指针,最好将所有字段声明为非指针。
还要注意,嵌入并不是真正的要求,它只是使您的类型及其用法更加平滑。User
也可能是的“普通”字段RequistrationRequest
,例如:
type RegistrationRequest struct { Usr User // This is just an ordinary field, not embedding
Email2 *string
}
以上是 为结构分配另一个结构 的全部内容, 来源链接: utcz.com/qa/400653.html