120 lines
3.3 KiB
Go
120 lines
3.3 KiB
Go
package refutil
|
||
|
||
import (
|
||
"bytes"
|
||
"encoding/base64"
|
||
"encoding/gob"
|
||
"fmt"
|
||
"reflect"
|
||
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/jx-callback/globals"
|
||
)
|
||
|
||
func CheckAndGetStructValue(item interface{}) *reflect.Value {
|
||
value := reflect.ValueOf(item)
|
||
if value.Kind() == reflect.Ptr {
|
||
value = value.Elem()
|
||
} else {
|
||
panic("item ust be ptr type")
|
||
}
|
||
return &value
|
||
}
|
||
|
||
func IsFieldExist(obj interface{}, fieldName string) bool {
|
||
return reflect.Indirect(reflect.ValueOf(obj)).FieldByName(fieldName).IsValid()
|
||
}
|
||
|
||
func GetObjFieldByName(obj interface{}, fieldName string) interface{} {
|
||
return reflect.Indirect(reflect.ValueOf(obj)).FieldByName(fieldName).Interface()
|
||
}
|
||
|
||
func SetObjFieldByName(obj interface{}, fieldName string, value interface{}) {
|
||
refValue := CheckAndGetStructValue(obj)
|
||
refValue.FieldByName(fieldName).Set(reflect.ValueOf(value))
|
||
}
|
||
|
||
func SerializeData(data interface{}) (strValue string, err error) {
|
||
var buf bytes.Buffer
|
||
enc := gob.NewEncoder(&buf)
|
||
if err = enc.Encode(data); err == nil {
|
||
strValue = base64.StdEncoding.EncodeToString(buf.Bytes())
|
||
return strValue, nil
|
||
}
|
||
return "", err
|
||
}
|
||
|
||
func DeSerializeData(strValue string, dataPtr interface{}) (err error) {
|
||
byteData, err := base64.StdEncoding.DecodeString(strValue)
|
||
if err == nil {
|
||
dec := gob.NewDecoder(bytes.NewReader(byteData))
|
||
return dec.Decode(dataPtr)
|
||
}
|
||
return err
|
||
}
|
||
|
||
// todo 这里看是否需要将key值转换成标准格式(即字母大写),因为beego orm不区分,不转换也可以
|
||
func FilterMapByStructObject(mapData map[string]interface{}, obj interface{}, objPtr interface{}, excludedFields []string, isCheckValue bool) (valid map[string]interface{}, invalid map[string]interface{}) {
|
||
excludedMap := make(map[string]int)
|
||
for _, v := range excludedFields {
|
||
excludedMap[v] = 1
|
||
}
|
||
m := utils.Struct2FlatMap(obj)
|
||
valid = make(map[string]interface{})
|
||
invalid = make(map[string]interface{})
|
||
for k, v := range mapData {
|
||
if m[k] != nil && excludedMap[k] == 0 /*&& v != nil*/ && (!isCheckValue || !IsValueEqual(m[k], v)) {
|
||
valid[k] = v
|
||
m[k] = v
|
||
} else {
|
||
invalid[k] = v
|
||
}
|
||
}
|
||
if objPtr != nil {
|
||
if err := utils.Map2StructByJson(m, objPtr, true); err != nil {
|
||
globals.SugarLogger.Warnf("FilterMapByStructObject failed with err:%v, mapData:%s", err, utils.Format4Output(mapData, true))
|
||
}
|
||
}
|
||
return valid, invalid
|
||
}
|
||
|
||
func FilterMapByFieldList(mapData map[string]interface{}, fields []string) (valid map[string]interface{}, invalid map[string]interface{}) {
|
||
valid = make(map[string]interface{})
|
||
invalid = make(map[string]interface{})
|
||
for _, field := range fields {
|
||
if mapData[field] != nil {
|
||
valid[field] = mapData[field]
|
||
} else {
|
||
invalid[field] = mapData[field]
|
||
}
|
||
}
|
||
return valid, invalid
|
||
}
|
||
|
||
func FindMapAndStructMixed(mapData map[string]interface{}, obj interface{}) (valid map[string]interface{}) {
|
||
valid = make(map[string]interface{})
|
||
map2 := utils.Struct2FlatMap(obj)
|
||
for k, v := range map2 {
|
||
if mapData[k] != nil {
|
||
valid[k] = v
|
||
}
|
||
}
|
||
return valid
|
||
}
|
||
|
||
func IsValueEqual(value1, value2 interface{}) bool {
|
||
if value1 == nil || value2 == nil {
|
||
return value1 == value2
|
||
}
|
||
return Interface2String(value1) == Interface2String(value2)
|
||
}
|
||
|
||
func Interface2String(value interface{}) (str string) {
|
||
valueType := reflect.TypeOf(value)
|
||
if valueType.Kind() == reflect.Ptr {
|
||
value = reflect.ValueOf(value).Elem()
|
||
}
|
||
str = fmt.Sprint(value)
|
||
return str
|
||
}
|