为了账号安全,请及时绑定邮箱和手机立即绑定

将一个结构复制到另一个结构具有相同成员和不同类型的结构

将一个结构复制到另一个结构具有相同成员和不同类型的结构

Go
千巷猫影 2022-01-10 16:38:14
我有两个struct具有相同的成员,我想将一个结构复制到另一个,请参见下面的伪代码:type Common struct {    Gender int    From   string    To     string}type Foo struct {    Id    string    Name  string    Extra Common}type Bar struct {    Id    string    Name  string    Extra Common}然后,我有foo结构的Foo,而bar结构的Bar,有什么办法复制bar的foo?
查看完整描述

3 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

使用转换来更改类型。以下代码使用转换将 typeFoo的值复制到 type的值Bar:


foo := Foo{Id: "123", Name: "Joe"}

bar := Bar(foo)

仅当基础类型除结构标记外相同时,转换才有效。


查看完整回答
反对 回复 2022-01-10
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

https://github.com/jinzhu/copier(gorm 的同一作者)也不错,我有嵌套结构,我所做的只是:

copier.Copy(&employees, &user)

效果很好


查看完整回答
反对 回复 2022-01-10
?
开满天机

TA贡献1786条经验 获得超13个赞

如果您想复制或克隆到不同的结构,我建议使用deepcopier


它提供了不错的功能,例如跳过、自定义映射和强制。以下是来自 github 的示例:


安装:


go get -u github.com/ulule/deepcopier

例子:


package main


import (

    "fmt"


    "github.com/ulule/deepcopier"

)


// Model

type User struct {

    // Basic string field

    Name  string

    // Deepcopier supports https://golang.org/pkg/database/sql/driver/#Valuer

    Email sql.NullString

}


func (u *User) MethodThatTakesContext(ctx map[string]interface{}) string {

    // do whatever you want

    return "hello from this method"

}


// Resource

type UserResource struct {

    //copy from field "Name"

    DisplayName            string `deepcopier:"field:Name"`

    //this will be skipped in copy 

    SkipMe                 string `deepcopier:"skip"`

    //this should call method named MethodThatTakesContext 

    MethodThatTakesContext string `deepcopier:"context"`

    Email                  string `deepcopier:"force"`


}


func main() {

    user := &User{

        Name: "gilles",

        Email: sql.NullString{

            Valid: true,

            String: "gilles@example.com",

        },

    }


    resource := &UserResource{}


    deepcopier.Copy(user).To(resource)

    //copied from User's Name field

    fmt.Println(resource.DisplayName)//output: gilles

    fmt.Println(resource.Email) //output: gilles@example.com

    fmt.Println(resource.MethodThatTakesContext) //output: hello from this method

}

此外,您可以通过其他方式将源对象编码为 JSON,然后将其解码回目标对象。


查看完整回答
反对 回复 2022-01-10
  • 3 回答
  • 0 关注
  • 336 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号