// Package define ... // // Description : define ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2024-03-08 11:04 package define import ( "git.zhangdeman.cn/zhangdeman/wrapper" "reflect" ) // DiffOption 做数据对比时的选项 // // Author : go_developer@163.com<白茶清欢> // // Date : 11:12 2024/3/8 type DiffOption struct { StrictMode bool `json:"strict_mode"` // 采用严格模式: 1 != "1" , 采用非严格模式 1 == "1" IgnoreEmptyString bool `json:"ignore_empty_string"` // 忽略空字符串, 若输入值为空字符串, 则不做比较, 认为两个值相同 IgnoreZeroNumber bool `json:"ignore_zero_number"` // 忽略置为0的数字, 若输入的数据为数字类型, 则不做比较, 认为两个值相同 IgnoreNil bool `json:"ignore_nil"` // 忽略 nil 值, 若输入值为NIL , 则不做比较, 认为两个值相同 CustomDiffFuncTable map[string]CustomDiffFunc `json:"-"` // 外部自定义的字段是否相同的比较函数, 会优先使用外部输入的比较函数 } // CustomDiffFunc 自定义字段对比方法 // // 输入分别如下: // // field : 要对比的字段 // // inputVal : 输入的原始数据 // // storageVal : 当前存储的数据 // // option : 对比时的额外选项 // // Author : go_developer@163.com<白茶清欢> // // Date : 11:06 2024/3/8 type CustomDiffFunc func(field string, inputVal wrapper.Map, storageVal wrapper.Map, option *DiffOption) *DiffResult // DiffResult 对比结果 // // Author : go_developer@163.com<白茶清欢> // // Date : 11:10 2024/3/8 type DiffResult struct { OldVal interface{} `json:"old_val"` // 当前field在storageVal中的值 NewVal interface{} `json:"new_val"` // 当前field在inputVal中的值 IsSame bool `json:"is_same"` // 两个值是否相同 DiffReason string `json:"diff_reason"` // 两个值不同的原因 Err error `json:"err"` // 对比过程中是否出现异常 } const ( DiffReasonTypeNotMatch = "TYPE_NOT_MATCH" // 类型不匹配 DiffReasonValueNotMatch = "VALUE_NOT_MATCH" // 数据值不匹配 ) var ( // 当前仅支持基础类型的比较,不支持slice/map/struct等复杂类型的比较 supportValueTypeTable = map[reflect.Kind]interface{}{ reflect.Bool: true, reflect.Int: true, reflect.Int8: true, reflect.Int16: true, reflect.Int32: true, reflect.Int64: true, reflect.Uint: true, reflect.Uint8: true, reflect.Uint16: true, reflect.Uint32: true, reflect.Uint64: true, reflect.Float32: true, reflect.Float64: true, // reflect.Ptr: true, } ) // IsSupportValueType ... // // Author : go_developer@163.com<白茶清欢> // // Date : 11:23 2024/3/8 func IsSupportValueType(kind reflect.Kind) bool { if _, exist := supportValueTypeTable[kind]; exist { return true } return false }