当前位置:网站首页>golang使用反射将一个结构体的数据直接复制到另一个结构体中(通过相同字段)

golang使用反射将一个结构体的数据直接复制到另一个结构体中(通过相同字段)

2022-06-10 14:36:00 Deng_Xian_Sheng

// CopyStruct
// dst 目标结构体,src 源结构体
// 必须传入指针,且不能为nil
// 它会把src与dst的相同字段名的值,复制到dst中
func CopyStruct(dst, src interface{
    }) {
    
	dstValue := reflect.ValueOf(dst).Elem()
	srcValue := reflect.ValueOf(src).Elem()

	for i := 0; i < srcValue.NumField(); i++ {
    
		srcField := srcValue.Field(i)
		srcName := srcValue.Type().Field(i).Name
		dstFieldByName := dstValue.FieldByName(srcName)

		if dstFieldByName.IsValid() {
    
			switch dstFieldByName.Kind() {
    
			case reflect.Ptr:
				switch srcField.Kind() {
    
				case reflect.Ptr:
					if srcField.IsNil() {
    
						dstFieldByName.Set(reflect.Zero(dstFieldByName.Type()))
					} else {
    
						dstFieldByName.Set(srcField)
					}
				default:
					dstFieldByName.Set(srcField.Addr())
				}
			default:
				switch srcField.Kind() {
    
				case reflect.Ptr:
					if srcField.IsNil() {
    
						dstFieldByName.Set(reflect.Zero(dstFieldByName.Type()))
					} else {
    
						dstFieldByName.Set(srcField.Elem())
					}
				default:
					dstFieldByName.Set(srcField)
				}
			}
		}
	}
}
原网站

版权声明
本文为[Deng_Xian_Sheng]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Deng_Xian_Sheng/article/details/125157882