deep_copy.go
func callDeepCopy(src, dst reflect.Value) bool {
	dc := src.MethodByName("DeepCopy")
	if !dc.IsValid() {
		return false
	}
	if dc.Type().NumIn() != 0 {
		return false
	}
	if dc.Type().NumOut() != 1 {
		return false
	}
	otype := dc.Type().Out(0)
	if dst.Kind() == reflect.Ptr &&
		dst.Type().Elem() == otype {
		cpy := reflect.New(dst.Type().Elem())
		out := dc.Call(nil)[0]
		cpy.Elem().Set(out)
		dst.Set(cpy)
		return true
	}
	if dst.Type() == otype {
		out := dc.Call(nil)[0]
		dst.Set(out)
		return true
	}
	return false
}
func callDeepCopy(src, dst reflect.Value) bool {
	dc := src.MethodByName("DeepCopy")
	if !dc.IsValid() {
		return false
	}
	if dc.Type().NumIn() != 0 {
		return false
	}
	if dc.Type().NumOut() != 1 {
		return false
	}
	otype := dc.Type().Out(0)
	if dst.Kind() == reflect.Ptr &&
		dst.Type().Elem() == otype {
		cpy := reflect.New(dst.Type().Elem())
		out := dc.Call(nil)[0]
		cpy.Elem().Set(out)
		dst.Set(cpy)
		return true
	}
	if dst.Type() == otype {
		out := dc.Call(nil)[0]
		dst.Set(out)
		return true
	}
	return false
}
//----------------------------------------
// misc.
// Call .DeepCopy() method if possible.