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的子集,它们完全是2种不同的类型,并且Assignability规则不适用。

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

最好是重构您的类型,RegistrationRequest可以embed 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
}

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

相关文章:

go - 如何在响应中访问值

c - 结构中的指针中不允许使用 VLA 有充分的理由吗?

python - 使用结构解析二进制文件中的数据

go - 如何保持 golang.org/x/net/websocket 打开?

go - negroni 中间件中设置的请求上下文在嵌套的 gorilla 子路由器中丢失

memory-management - 我是否需要将 map 设置为 nil 才能对其进行垃圾回收?

struct - 戈朗 : type conversion between slices of structs

c# - Marshall 在 c# 中使用 ifdef 和联合构造结构

json - 编码嵌套对象

go - 在 IntelliJ 中导入 Go 项目不起作用