一尘不染

为结构分配另一个结构

go

我有一个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超出注册的范围。

所以我有两个变量:requ-每个结构一个。是否可以将req结构分配给该u结构,以便所有公共字段都将存在于该u结构中?


阅读 380

收藏
2020-07-02

共1个答案

一尘不染

使用简单分配,您不能这样做,因为即使的字段User是的子集RegistrationRequest,它们也完全是2种不同的类型,并且可分配性规则不适用。

您可以编写一个使用反射(reflect包)的函数,并将所有字段从复制requ,但这很丑陋(且效率低下)。

最好是重构您的类型,并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
}
2020-07-02