How to copy an interface value in Go?

前端 未结 3 457
谎友^
谎友^ 2020-12-08 16:16

How to copy an interface value in Go?

My User interface:

type User interface {
    Name() string
    SetName(name string)
}
3条回答
  •  爱一瞬间的悲伤
    2020-12-08 17:21

    There is a more generic way to do that.

    func Clone(oldObj interface{}) interface{} {
        newObj := reflect.New(reflect.TypeOf(oldObj).Elem())
        oldVal := reflect.ValueOf(oldObj).Elem()
        newVal := newObj.Elem()
        for i := 0; i < oldVal.NumField(); i++ {
            newValField := newVal.Field(i)
            if newValField.CanSet() {
                newValField.Set(oldVal.Field(i))
            }
        }
    
        return newObj.Interface()
    }
    

    However, it has one pitfall: it cannot set unexported fields. It can be worked around using this solution with the help of unsafe's black magic, but I would rather avoid it.

提交回复
热议问题