我有一个RegistrationRequest结构:
type RegistrationRequest struct {
Email *string
Email2 *string
Username *string
Password *string
Name string
}
Run Code Online (Sandbox Code Playgroud)
当Email2再次是电子邮件输入值,以验证什么输入的用户是正确的.
我也有一个User结构:
type User struct {
Email *string
Username *string
Password *string
Name string
}
Run Code Online (Sandbox Code Playgroud)
当然,Email2除了注册之外没有必要存储.
所以,我有两个变量:req和u-每个结构.是否可以将req结构分配到u结构中,以便所有公共字段都存在于u结构中?
icz*_*cza 20
使用简单赋值是不可能的,因为即使字段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)
}
Run Code Online (Sandbox Code Playgroud)
输出:(在Go Playground试试)
testuser as@as.com
Run Code Online (Sandbox Code Playgroud)
另请注意,由于结构包含指针,因此在复制时struct,指针值将被复制而不是指向的值.我不确定你为什么需要指针,最好只声明所有字段都是非指针.
另请注意,嵌入并非真正的要求,它只会使您的类型及其使用更加流畅.User也可以是一个"普通"的领域RequistrationRequest,例如:
type RegistrationRequest struct {
Usr User // This is just an ordinary field, not embedding
Email2 *string
}
Run Code Online (Sandbox Code Playgroud)
您可以使用“ github.com/jinzhu/copier ”包在包含相同字段名称的结构之间进行复制。这个包使用反射来做到这一点。
package main
import (
"fmt"
"github.com/jinzhu/copier"
)
type RegistrationRequest struct {
Email *string
Email2 *string
Username *string
Password *string
Name string
}
type User struct {
Email *string
Username *string
Password *string
Name string
}
func main() {
user := new(User)
req := new(RegistrationRequest)
user.Email, user.Password, user.Username = new(string), new(string), new(string)
user.Name = "John Doe"
*user.Email = "a@b.com"
*user.Password = "1234"
*user.Username = "johndoe"
fmt.Println("User :",user.Name, *user.Email, *user.Username, *user.Password)
copier.Copy(req, user)
fmt.Println("RegistrationRequest :",req.Name, *req.Email, *req.Username, *req.Password)
}
Run Code Online (Sandbox Code Playgroud)
输出
User : John Doe a@b.com johndoe 1234
RegistrationRequest : John Doe a@b.com johndoe 1234
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12951 次 |
| 最近记录: |