package utils import ( "reflect" "strconv" "time" ) func ValueType(in interface{}) string { if in == nil { return "" } switch in.(type) { case int: return "int" case int8: return "int8" case int16: return "int16" case int32: return "int32" case int64: return "int64" case uint: return "uint" case uint8: return "uint8" case uint16: return "uint16" case uint32: return "uint32" case uint64: return "uint64" case float32: return "float32" case float64: return "float64" case []byte: return "[]byte" case string: return "string" case []string: return "[]string" case *[]byte: return "*[]byte" case *string: return "*string" case []*string: return "[]*string" default: } rv := reflect.ValueOf(in) switch rv.Kind() { case reflect.Map: return "reflect.Map" case reflect.Array: return "reflect.Array" case reflect.Slice: return "reflect.Slice" } return "[" + rv.Kind().String() + "]" + reflect.TypeOf(in).Name() } func ValueToInt(in interface{}, def int) int { if in == nil { return def } switch in.(type) { case int: return in.(int) case int8: return int(in.(int8)) case int16: return int(in.(int16)) case int32: return int(in.(int32)) case int64: return int(in.(int64)) case uint: return int(in.(uint)) case uint8: return int(in.(uint8)) case uint16: return int(in.(uint16)) case uint32: return int(in.(uint32)) case uint64: return int(in.(uint64)) case float32: return int(in.(float32)) case float64: return int(in.(float64)) case []byte: ii, _ := strconv.ParseFloat(string(in.([]byte)), 64) return int(ii) case string: ii, _ := strconv.ParseFloat(in.(string), 64) return int(ii) case *[]byte: ii, _ := strconv.ParseFloat(string(*(in.(*[]byte))), 64) return int(ii) case *string: ii, _ := strconv.ParseFloat(*(in.(*string)), 64) return int(ii) default: } return def } func ValueToFloat(in interface{}, def float64) float64 { if in == nil { return def } switch in.(type) { case int: return float64(in.(int)) case int8: return float64(in.(int8)) case int16: return float64(in.(int16)) case int32: return float64(in.(int32)) case int64: return float64(in.(int64)) case uint: return float64(in.(uint)) case uint8: return float64(in.(uint8)) case uint16: return float64(in.(uint16)) case uint32: return float64(in.(uint32)) case uint64: return float64(in.(uint64)) case float32: return float64(in.(float32)) case float64: return in.(float64) case []byte: ii, _ := strconv.ParseFloat(string(in.([]byte)), 64) return ii case string: ii, _ := strconv.ParseFloat(in.(string), 64) return ii case *[]byte: ii, _ := strconv.ParseFloat(string(*(in.(*[]byte))), 64) return ii case *string: ii, _ := strconv.ParseFloat(*(in.(*string)), 64) return ii default: } return def } func ValueToString(in interface{}, def string) string { return ValueToStringIn(in, def, 0) } func ValueToStringIn(in interface{}, def string, fixed int) string { if in == nil { return def } switch in.(type) { case int: return strconv.FormatInt(int64(in.(int)), 10) case int8: return strconv.FormatInt(int64(in.(int8)), 10) case int16: return strconv.FormatInt(int64(in.(int16)), 10) case int32: return strconv.FormatInt(int64(in.(int32)), 10) case int64: return strconv.FormatInt(in.(int64), 10) case uint: return strconv.FormatUint(uint64(in.(uint)), 10) case uint8: return strconv.FormatUint(uint64(in.(uint8)), 10) case uint16: return strconv.FormatUint(uint64(in.(uint16)), 10) case uint32: return strconv.FormatUint(uint64(in.(uint32)), 10) case uint64: return strconv.FormatUint(in.(uint64), 10) case float32: if fixed > 0 { return strconv.FormatFloat(float64(in.(float32)), 'f', fixed, 32) } return strconv.FormatFloat(float64(in.(float32)), 'f', 10, 32) case float64: if fixed > 0 { return strconv.FormatFloat(in.(float64), 'f', fixed, 64) } return strconv.FormatFloat(in.(float64), 'f', 10, 64) case []byte: return string(in.([]byte)) case string: return in.(string) case *[]byte: return string(*(in.(*[]byte))) case *string: return *(in.(*string)) default: } return def } func ValueToTime(in interface{}, timeFormat string, def string) string { if in == nil { return def } switch in.(type) { case time.Time: return TimeFormat(in.(time.Time), timeFormat) case *time.Time: return TimeFormat(*(in.(*time.Time)), timeFormat) case []byte: return string(in.([]byte)) case string: return in.(string) case *[]byte: return string(*(in.(*[]byte))) case *string: return *(in.(*string)) default: res := ValueToInt(in, 0) return TimeFormat(time.Unix(int64(res), 0), timeFormat) } return def } func ValueIsEmpty(in interface{}) bool { if in == nil { return true } rv := reflect.ValueOf(in) switch rv.Kind() { case reflect.Map, reflect.Array, reflect.Slice: return rv.Len() == 0 } switch in.(type) { case bool: return !in.(bool) case *bool: return !(*(in.(*bool))) case int: return in.(int) == 0 case int8: return in.(int8) == 0 case int16: return in.(int16) == 0 case int32: return in.(int32) == 0 case int64: return in.(int64) == 0 case uint: return in.(uint) == 0 case uint8: return in.(uint8) == 0 case uint16: return in.(uint16) == 0 case uint32: return in.(uint32) == 0 case uint64: return in.(uint64) == 0 case float32: return in.(float32) == 0.0 case float64: return in.(float64) == 0.0 case string: return len(in.(string)) == 0 case *string: return len(*(in.(*string))) == 0 default: } return rv.IsNil() } func ValueToStringArray(in interface{}) []string { arr, ok := in.([]interface{}) if !ok { return nil } res := make([]string, 0) for _, v := range arr { res = append(res, ValueToString(v, "")) } return res } func ValueToIntArray(in interface{}) []int { arr, ok := in.([]interface{}) if !ok { return nil } res := make([]int, 0) for _, v := range arr { res = append(res, ValueToInt(v, 0)) } return res } func ValueToFloatArray(in interface{}) []float64 { arr, ok := in.([]interface{}) if !ok { return nil } res := make([]float64, 0) for _, v := range arr { res = append(res, ValueToFloat(v, 0.0)) } return res } func ValueFromStringArray(in []string) []interface{} { out := make([]interface{}, len(in)) for k, v := range in { out[k] = v } return out } func ValueFromIntArray(in []int) []interface{} { out := make([]interface{}, len(in)) for k, v := range in { out[k] = v } return out } func ValueFromFloatArray(in []float64) []interface{} { out := make([]interface{}, len(in)) for k, v := range in { out[k] = v } return out } func IDsToString(ids []int) string { ll := len(ids) str := "" for i := 0; i < ll; i++ { if i > 0 { str = str + "','" + ValueToString(ids[i], "") } else { str = "('" + ValueToString(ids[i], "") } } if len(str) > 0 { str = str + "')" } return str }