mirror of
https://github.com/jerryWangor/iris_web.git
synced 2025-12-24 13:37:51 +08:00
235 lines
5.7 KiB
Go
235 lines
5.7 KiB
Go
// +----------------------------------------------------------------------
|
||
// | EasyGoAdmin敏捷开发框架 [ 赋能开发者,助力企业发展 ]
|
||
// +----------------------------------------------------------------------
|
||
// | 版权所有 2019~2022 深圳EasyGoAdmin研发中心
|
||
// +----------------------------------------------------------------------
|
||
// | Licensed LGPL-3.0 EasyGoAdmin并不是自由软件,未经许可禁止去掉相关版权
|
||
// +----------------------------------------------------------------------
|
||
// | 官方网站: http://www.easygoadmin.vip
|
||
// +----------------------------------------------------------------------
|
||
// | Author: @半城风雨 团队荣誉出品
|
||
// +----------------------------------------------------------------------
|
||
// | 版权和免责声明:
|
||
// | 本团队对该软件框架产品拥有知识产权(包括但不限于商标权、专利权、著作权、商业秘密等)
|
||
// | 均受到相关法律法规的保护,任何个人、组织和单位不得在未经本团队书面授权的情况下对所授权
|
||
// | 软件框架产品本身申请相关的知识产权,禁止用于任何违法、侵害他人合法权益等恶意的行为,禁
|
||
// | 止用于任何违反我国法律法规的一切项目研发,任何个人、组织和单位用于项目研发而产生的任何
|
||
// | 意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失 (包括但不限于直接、间接、
|
||
// | 附带或衍生的损失等),本团队不承担任何法律责任,本软件框架禁止任何单位和个人、组织用于
|
||
// | 任何违法、侵害他人合法利益等恶意的行为,如有发现违规、违法的犯罪行为,本团队将无条件配
|
||
// | 合公安机关调查取证同时保留一切以法律手段起诉的权利,本软件框架只能用于公司和个人内部的
|
||
// | 法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件;
|
||
// +----------------------------------------------------------------------
|
||
|
||
package gconv
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"reflect"
|
||
"strconv"
|
||
"time"
|
||
)
|
||
|
||
// String converts `any` to string.
|
||
// It's most common used converting function.
|
||
func String(any interface{}) string {
|
||
if any == nil {
|
||
return ""
|
||
}
|
||
switch value := any.(type) {
|
||
case int:
|
||
return strconv.Itoa(value)
|
||
case int8:
|
||
return strconv.Itoa(int(value))
|
||
case int16:
|
||
return strconv.Itoa(int(value))
|
||
case int32:
|
||
return strconv.Itoa(int(value))
|
||
case int64:
|
||
return strconv.FormatInt(value, 10)
|
||
case uint:
|
||
return strconv.FormatUint(uint64(value), 10)
|
||
case uint8:
|
||
return strconv.FormatUint(uint64(value), 10)
|
||
case uint16:
|
||
return strconv.FormatUint(uint64(value), 10)
|
||
case uint32:
|
||
return strconv.FormatUint(uint64(value), 10)
|
||
case uint64:
|
||
return strconv.FormatUint(value, 10)
|
||
case float32:
|
||
return strconv.FormatFloat(float64(value), 'f', -1, 32)
|
||
case float64:
|
||
return strconv.FormatFloat(value, 'f', -1, 64)
|
||
case bool:
|
||
return strconv.FormatBool(value)
|
||
case string:
|
||
return value
|
||
case []byte:
|
||
return string(value)
|
||
case time.Time:
|
||
if value.IsZero() {
|
||
return ""
|
||
}
|
||
return value.String()
|
||
case *time.Time:
|
||
if value == nil {
|
||
return ""
|
||
}
|
||
return value.String()
|
||
default:
|
||
// Empty checks.
|
||
if value == nil {
|
||
return ""
|
||
}
|
||
// Reflect checks.
|
||
var (
|
||
rv = reflect.ValueOf(value)
|
||
kind = rv.Kind()
|
||
)
|
||
switch kind {
|
||
case reflect.Chan,
|
||
reflect.Map,
|
||
reflect.Slice,
|
||
reflect.Func,
|
||
reflect.Ptr,
|
||
reflect.Interface,
|
||
reflect.UnsafePointer:
|
||
if rv.IsNil() {
|
||
return ""
|
||
}
|
||
case reflect.String:
|
||
return rv.String()
|
||
}
|
||
if kind == reflect.Ptr {
|
||
return String(rv.Elem().Interface())
|
||
}
|
||
// Finally we use json.Marshal to convert.
|
||
if jsonContent, err := json.Marshal(value); err != nil {
|
||
return fmt.Sprint(value)
|
||
} else {
|
||
return string(jsonContent)
|
||
}
|
||
}
|
||
}
|
||
|
||
func Int(any interface{}) int {
|
||
if any == nil {
|
||
return 0
|
||
}
|
||
if v, ok := any.(int); ok {
|
||
return v
|
||
}
|
||
return int(Int64(any))
|
||
}
|
||
|
||
// Int64 converts `any` to int64.
|
||
func Int64(any interface{}) int64 {
|
||
if any == nil {
|
||
return 0
|
||
}
|
||
switch value := any.(type) {
|
||
case int:
|
||
return int64(value)
|
||
case int8:
|
||
return int64(value)
|
||
case int16:
|
||
return int64(value)
|
||
case int32:
|
||
return int64(value)
|
||
case int64:
|
||
return value
|
||
case uint:
|
||
return int64(value)
|
||
case uint8:
|
||
return int64(value)
|
||
case uint16:
|
||
return int64(value)
|
||
case uint32:
|
||
return int64(value)
|
||
case uint64:
|
||
return int64(value)
|
||
case float32:
|
||
return int64(value)
|
||
case float64:
|
||
return int64(value)
|
||
case bool:
|
||
if value {
|
||
return 1
|
||
}
|
||
return 0
|
||
|
||
default:
|
||
s := String(value)
|
||
isMinus := false
|
||
if len(s) > 0 {
|
||
if s[0] == '-' {
|
||
isMinus = true
|
||
s = s[1:]
|
||
} else if s[0] == '+' {
|
||
s = s[1:]
|
||
}
|
||
}
|
||
// Hexadecimal
|
||
if len(s) > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X') {
|
||
if v, e := strconv.ParseInt(s[2:], 16, 64); e == nil {
|
||
if isMinus {
|
||
return -v
|
||
}
|
||
return v
|
||
}
|
||
}
|
||
// Octal
|
||
if len(s) > 1 && s[0] == '0' {
|
||
if v, e := strconv.ParseInt(s[1:], 8, 64); e == nil {
|
||
if isMinus {
|
||
return -v
|
||
}
|
||
return v
|
||
}
|
||
}
|
||
// Decimal
|
||
if v, e := strconv.ParseInt(s, 10, 64); e == nil {
|
||
if isMinus {
|
||
return -v
|
||
}
|
||
return v
|
||
}
|
||
// Float64
|
||
return int64(Float64(value))
|
||
}
|
||
}
|
||
|
||
// Float64 converts `any` to float64.
|
||
func Float64(any interface{}) float64 {
|
||
if any == nil {
|
||
return 0
|
||
}
|
||
switch value := any.(type) {
|
||
case float32:
|
||
return float64(value)
|
||
case float64:
|
||
return value
|
||
|
||
default:
|
||
v, _ := strconv.ParseFloat(String(any), 64)
|
||
return v
|
||
}
|
||
}
|
||
|
||
// Bytes converts <i> to []byte.
|
||
func Bytes(i interface{}) []byte {
|
||
if i == nil {
|
||
return nil
|
||
}
|
||
switch value := i.(type) {
|
||
case string:
|
||
return []byte(value)
|
||
case []byte:
|
||
return value
|
||
default:
|
||
return nil
|
||
}
|
||
}
|