struct - 将结构分配给另一个结构

标签 struct 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 结构,以便所有公共(public)字段都将存在于 u 结构中?

最佳答案

使用简单 assignment你不能,因为尽管 User 的字段是 RegistrationRequest 的子集,但它们完全是两种不同的类型,并且 Assignability规则不适用。

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

最好重构您的类型,RegistrationRequest 可以 embed 用户

如果您有一个 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
}

关于struct - 将结构分配给另一个结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53665398/

相关文章:

c++ - 将临时结构作为模板参数传递

c - 错误 98 :Conflict with previous definition of x for attribute 'type'

go - 如何在 go 中使用字符串文字

go - 指针的行为

c - 定义一个包含函数指针的结构,该函数指针指向以该结构作为参数的函数

c - 错误: Conflicting types in structs pointers

c - 读取二进制文件时如何分别对每个结构体字段使用 fread() ?

swift - 将巨大的 C++ 库自动包装到 C 以在 Swift/Go 中导入

string - 字符串.Builder的内存使用情况

amazon-web-services - 如何使用此架构在 Elastic Search 中复制索引?