// Package wrapper ... // // Description : wrapper ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2024-08-21 16:43 package wrapper import ( "fmt" "reflect" ) func NewDynamic() *DynamicStruct { return &DynamicStruct{ structFieldList: make([]reflect.StructField, 0), } } // DynamicStruct 动态生成数据结构 // // Author : go_developer@163.com<白茶清欢> // // Date : 16:48 2024/8/21 type DynamicStruct struct { structFieldList []reflect.StructField // 结构体字段列表 } // AddInt 添加int字段统一Int64 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:50 2024/8/21 func (ds *DynamicStruct) AddInt(fieldName string, fieldTag string, pkgPath string) { ds.AddStructField(reflect.StructField{ Name: fieldName, PkgPath: pkgPath, Type: reflect.TypeOf(int64(0)), Tag: reflect.StructTag(fmt.Sprintf(`json:"%v"`, fieldTag)), }) } // AddUint 添加uint字段, 统一 uint64 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:50 2024/8/21 func (ds *DynamicStruct) AddUint(fieldName string, fieldTag string, pkgPath string) { ds.AddStructField(reflect.StructField{ Name: fieldName, PkgPath: pkgPath, Type: reflect.TypeOf(uint64(0)), Tag: reflect.StructTag(fieldTag), }) } // AddString 添加字符串字段 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:49 2024/8/21 func (ds *DynamicStruct) AddString(fieldName string, fieldTag string, pkgPath string) { ds.AddStructField(reflect.StructField{ Name: fieldName, PkgPath: pkgPath, Type: reflect.TypeOf(""), Tag: reflect.StructTag(fmt.Sprintf(`json:"%v"`, fieldTag)), }) } // AddBool 添加bool字段 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:49 2024/8/21 func (ds *DynamicStruct) AddBool(fieldName string, fieldTag string, pkgPath string) { ds.AddStructField(reflect.StructField{ Name: fieldName, PkgPath: pkgPath, Type: reflect.TypeOf(true), Tag: reflect.StructTag(fmt.Sprintf(`json:"%v"`, fieldTag)), }) } // AddFloat 添加float字段, 统一 float64 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:48 2024/8/21 func (ds *DynamicStruct) AddFloat(fieldName string, fieldTag string, pkgPath string) { ds.AddStructField(reflect.StructField{ Name: fieldName, PkgPath: pkgPath, Type: reflect.TypeOf(float64(0)), Tag: reflect.StructTag(fmt.Sprintf(`json:"%v"`, fieldTag)), }) } // AddSlice 添加slice // // Author : go_developer@163.com<白茶清欢> // // Date : 17:47 2024/8/21 func (ds *DynamicStruct) AddSlice(fieldName string, fieldTag string, pkgPath string) { ds.AddStructField(reflect.StructField{ Name: fieldName, PkgPath: pkgPath, Type: reflect.TypeOf([]any{}), Tag: reflect.StructTag(fieldTag), }) } // AddMap 添加map字段 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:43 2024/8/21 func (ds *DynamicStruct) AddMap(fieldName string, fieldTag string, pkgPath string) { ds.AddStructField(reflect.StructField{ Name: fieldName, PkgPath: pkgPath, Type: reflect.TypeOf(map[string]any{}), Tag: reflect.StructTag(fieldTag), }) } // AddAny 添加任意类型字段 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:52 2024/8/21 func (ds *DynamicStruct) AddAny(fieldName string, fieldTag string, pkgPath string, value any) { if nil == value { // 不能是空指针 return } ds.AddStructField(reflect.StructField{ Name: fieldName, PkgPath: pkgPath, Type: reflect.TypeOf(value), Tag: reflect.StructTag(fieldTag), }) } // AddStructField 添加结构体字段 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:42 2024/8/21 func (ds *DynamicStruct) AddStructField(field reflect.StructField) { if field.Tag == "" { field.Tag = reflect.StructTag(fmt.Sprintf(`json:"%v"`, field.Name)) } field.Name = String(field.Name).SnakeCaseToCamel() // 转成大驼峰, 保证对外可访问 ds.structFieldList = append(ds.structFieldList, field) } // GetStructType 获取结构体的类型 // // Author : go_developer@163.com<白茶清欢> // // Date : 16:58 2024/8/21 func (ds *DynamicStruct) GetStructType() reflect.Type { return reflect.StructOf(ds.structFieldList) } // ToStructDefaultValue 获取结构体的值, 并采用对应类型默认值填充相关字段 // // Author : go_developer@163.com<白茶清欢> // // Date : 16:56 2024/8/21 func (ds *DynamicStruct) ToStructDefaultValue() any { defer ds.Clear() defaultValue := reflect.New(ds.GetStructType()).Elem().Interface() return defaultValue } // ToStructDefaultSliceValue 自动生成结构体列表 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:04 2024/8/21 func (ds *DynamicStruct) ToStructDefaultSliceValue() any { defer ds.Clear() tSlice := reflect.MakeSlice(reflect.SliceOf(ds.GetStructType()), 0, 0) return reflect.New(tSlice.Type()).Elem().Interface() } // Clear 清理 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:08 2024/8/21 func (ds *DynamicStruct) Clear() { // 清理掉已设置的字段, 不然实例复用会互相影响 ds.structFieldList = make([]reflect.StructField, 0) }