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 - 流媒体,分布式,即时通信

赞同来自:

写个函数可以吗?


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

要回复问题请先登录注册