使用另一个结构分配struct

tom*_*456 15 struct go

我有一个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除了注册之外没有必要存储.

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

icz*_*cza 20

使用简单赋值是不可能的,因为即使字段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)
}
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)

  • @tommyd456 请阅读什么是[嵌入](http://golang.org/ref/spec#Struct_types)。嵌入时,仅提供_type_,但不提供_name_。所以“User”是类型。“User”的字段被_提升_到嵌入器结构中。但您可以使用类型名称来引用嵌入的值。 (2认同)

Pra*_*jan 5

您可以使用“ 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)