猿问

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

我有两个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?


千巷猫影
浏览 337回答 3
3回答

Qyouu

使用转换来更改类型。以下代码使用转换将 typeFoo的值复制到 type的值Bar:foo := Foo{Id: "123", Name: "Joe"}bar := Bar(foo)仅当基础类型除结构标记外相同时,转换才有效。

明月笑刀无情

https://github.com/jinzhu/copier(gorm 的同一作者)也不错,我有嵌套结构,我所做的只是:copier.Copy(&employees, &user)效果很好

开满天机

如果您想复制或克隆到不同的结构,我建议使用deepcopier它提供了不错的功能,例如跳过、自定义映射和强制。以下是来自 github 的示例:安装:go get -u github.com/ulule/deepcopier例子:package mainimport (    "fmt"    "github.com/ulule/deepcopier")// Modeltype 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"}// Resourcetype 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,然后将其解码回目标对象。
随时随地看视频慕课网APP

相关分类

Go
我要回答