复制一个对象

作者: yanjusong | 来源:发表于2019-06-22 17:54 被阅读0次
package main

import (
    "fmt"
    "reflect"
)

type Animal interface {
    say()
}

type Base struct {
    Id int
}

type Dog struct {
    *Base
    name string
}

type Cat struct {
    Base
    Name  string
    Color string
}

func (c *Cat) say() {
    fmt.Printf("Cat: my Name is %s[%s]\n", c.Name, c.Color);
}

func (d *Dog) say() {
    fmt.Printf("Dog: my Name is %s\n", d.name);
}

func getCopyObj(a Animal) interface{} {
    reflectVal := reflect.ValueOf(a)
    // Indirect获取引用指向对象的类型
    t := reflect.Indirect(reflectVal).Type()
    obj := reflect.New(t)

    dst, ok := obj.Interface().(Animal)

    if !ok {
        panic("controller is not ControllerInterface")
    }

    elemVal := reflect.ValueOf(a).Elem()
    elemType := reflect.TypeOf(a).Elem()
    execElem := reflect.ValueOf(dst).Elem()


    numOfFields := elemVal.NumField()
    for i := 0; i < numOfFields; i++ {
        fieldType := elemType.Field(i)
        elemField := execElem.FieldByName(fieldType.Name)
        if elemField.CanSet() {
            fieldVal := elemVal.Field(i)
            elemField.Set(fieldVal)
        }
    }

    return dst
}

func showCopy(src Animal) {
    fmt.Printf("src: %+v\n", src)
    dst := getCopyObj(src)
    fmt.Printf("dst: %+v\n", dst)
}

func main() {
    c := &Cat{
        Base: Base{
            Id: 100,
        },
        Name:  "Tom",
        Color: "Red",
    }
    showCopy(c)

    d := &Dog{
        Base: &Base{
            Id: 99,
        },
        name: "Tony",
    }
    showCopy(d)
}

Output:


image.png

相关文章

  • UI(十五)深浅拷贝

    拷贝:复制一个对象->变成另外一个对象 深拷贝:复制对象 并且复制对象里面的内容 完全拷贝 浅拷贝:指针拷贝 只拷...

  • JavaScript 的深拷贝与浅拷贝

    一、浅拷贝 拷贝-复制, 将一个对象的属性和方法复制到另一个对象上, 只复制一层,如果属性是对象,复制对象的地址。...

  • 深入浅出深度复制与浅度复制(demo)

    深度复制:复制一个对象时并且复制了该对象的引用(引用的引用。。。)。 浅度复制:仅仅复制该对象的成员变量(基本类型...

  • Copy

    copy 复制 浅复制:指针的复制(地址的复制) 深复制:对象内容的复制 Foundion的基本对象复制 基本对象...

  • java设计模式-原型模式

    原型模式,顾名思义就是对现有的一个对象进行复制克隆出一个全新的对象。被复制的对象就叫做原型对象,复制出来的克隆对象...

  • 深复制与浅复制

    浅复制 浅复制就是,直接把一个对象(源对象)的属性复制到另一个对象(目标对象)中,当然,如果当属性中包含引用类型的...

  • iOS面试题:浅复制和深复制的区别?

    浅层复制:只复制指向对象的指针,而不复制引用对象本身。深层复制:复制引用对象本身。意思就是说我有个 A 对象,复制...

  • 深复制与浅复制

    概念: 浅复制与深复制都是只针对对象,数组,这些复杂类型。 浅复制指的是复制一个对象的一层属性,如果对象,数组内嵌...

  • Java对象复制之Cglib和mapstruct讲解

    1 Java对象复制 1.1 Cglib复制 BeanCopier是Cglib包中的一个类,用于对象的复制。注意:...

  • shallow copy & deep copy

    浅拷贝:只复制指向对象的指针,而不复制引用对象本身。在另一个地方用同一个指针引用该对象。 深拷贝:复制引用对象本身...

网友评论

    本文标题:复制一个对象

    本文链接:https://www.haomeiwen.com/subject/evuvqctx.html