struct的拷贝问题

包a下有struct A,包b下有struct B,并且struct A和struct B的结构完全一致,有哪些方法可以将struct A的内容拷贝到struct B中?

已邀请:

angelina - 初学者

赞同来自: godonggua niugou

可以强制类型转换,类似下面这种

package main

import "fmt"

type A struct {
    Name string
}

type B struct {
    Name string
}

func main() {
    var a A
    a.Name = "xxx"
    var b B
    b = B(a)
    fmt.Printf("%#v", a)
    fmt.Println("----")
    fmt.Printf("%#v", b)
}

tonyluj - Go

赞同来自: godonggua andylau004

虽然反射慢一点,不过实现起来更通用、更容易理解
https://play.golang.org/p/Tjwg5iFubA

// dst should be a pointer to struct, src should be a struct
func Copy(dst interface{}, src interface{}) (err error) {
        dstValue := reflect.ValueOf(dst)
        if dstValue.Kind() != reflect.Ptr {
                err = errors.New("dst isn't a pointer to struct")
                return
        }
        dstElem := dstValue.Elem()
        if dstElem.Kind() != reflect.Struct {
                err = errors.New("pointer doesn't point to struct")
                return
        }

        srcValue := reflect.ValueOf(src)
        srcType := reflect.TypeOf(src)
        if srcType.Kind() != reflect.Struct {
                err = errors.New("src isn't struct")
                return
        }

        for i := 0; i < srcType.NumField(); i++ {
                sf := srcType.Field(i)
                sv := srcValue.FieldByName(sf.Name)
                // make sure the value which in dst is valid and can set
                if dv := dstElem.FieldByName(sf.Name); dv.IsValid() && dv.CanSet() {
                        dv.Set(sv)
                }
        }
        return
}

linuxr

赞同来自:

强制类型转换是一种,还可以通过序列化来完成值的复制。 比如 把A 序列化成json,再把json映射到 B 上

sheepbao - https://sheepbao.github.io 爱go,爱编程,领域网络开发,流媒体、分布式、网络加速

赞同来自:

写个函数可以吗?

CopyA2B(a A) B {
    var b B
    b.xxx=a.xxx
    b.yyy=a.yyy
    return b
}

要回复问题请先登录注册