wrapper/any.go

101 lines
2.0 KiB
Go
Raw Normal View History

// Package wrapper ...
//
// Description : wrapper ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2023-06-01 18:18
package wrapper
2023-10-11 15:16:00 +08:00
import (
"git.zhangdeman.cn/zhangdeman/serialize"
"reflect"
)
// AnyDataType ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:19 2023/6/1
func AnyDataType(data interface{}) *AnyType {
2023-10-11 15:05:01 +08:00
at := &AnyType{
data: data,
}
2023-10-11 15:16:00 +08:00
at.dataType = at.Type()
2023-10-11 15:05:01 +08:00
return at
}
// AnyType ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:19 2023/6/1
type AnyType struct {
2023-10-11 15:05:01 +08:00
data interface{}
dataType string
}
// IsNil 是否为 nil
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:21 2023/6/1
func (at *AnyType) IsNil() bool {
return at.data == nil
}
// Type 获取类型
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:22 2023/6/1
func (at *AnyType) Type() string {
2023-10-11 15:05:01 +08:00
if len(at.dataType) > 0 {
// 已经处理过的,无需在处理
return at.dataType
}
if at.IsNil() {
return DataTypeNil
}
reflectType := reflect.TypeOf(at.data)
switch reflectType.Kind() {
2023-10-11 15:16:00 +08:00
case reflect.String:
return DataTypeString
case reflect.Slice, reflect.Array:
return DataTypeSlice
case reflect.Map, reflect.Struct:
return DataTypeObject
case reflect.Pointer:
return DataTypePtr
2023-10-11 15:16:00 +08:00
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return DataTypeInt
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
return DataTypeUint
case reflect.Bool:
return DataTypeBool
case reflect.Float32, reflect.Float64:
return DataTypeFloat
default:
2023-10-11 15:16:00 +08:00
return DataTypeUnknown
}
}
2023-06-01 18:32:45 +08:00
// ToString 转为字符串
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:32 2023/6/1
2023-10-11 15:16:00 +08:00
func (at *AnyType) ToString() String {
switch at.dataType {
case DataTypeNil:
return String("")
case DataTypeObject:
fallthrough
case DataTypeSlice:
fallthrough
case DataTypePtr:
return String(serialize.JSON.MarshalForString(at.data))
}
2023-06-01 18:32:45 +08:00
return ""
}