package utils
|
|
|
|
import (
|
|
"reflect"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
func ValueType(in interface{}) string {
|
|
if in == nil {
|
|
return "<nil>"
|
|
}
|
|
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 ValueToStringTwo(in interface{}, def string) string {
|
|
return ValueToStringIn(in, def, 2)
|
|
}
|
|
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
|
|
}
|