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
}
func callDeepCopy ( src , dst reflect . Value ) bool { dc := src . MethodByName ( " " ) 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.
---------------------------------------- misc . Call . DeepCopy () method if possible .