Merge branch 'master' of e.coding.net:rosydev/baseapi
This commit is contained in:
@@ -7,12 +7,13 @@ import (
|
||||
"fmt"
|
||||
"math"
|
||||
"net/url"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.rosy.net.cn/baseapi"
|
||||
"github.com/fatih/structs"
|
||||
"github.com/gazeboxu/structs"
|
||||
"github.com/mitchellh/mapstructure"
|
||||
)
|
||||
|
||||
@@ -70,15 +71,22 @@ func TryInterface2Int64(data interface{}) (num int64, err error) {
|
||||
if dataNumber, ok := data.(int); ok {
|
||||
return int64(dataNumber), nil
|
||||
}
|
||||
dataNumber, ok := data.(json.Number)
|
||||
if !ok {
|
||||
return 0, fmt.Errorf("data is not json.Number:%v to int64", data)
|
||||
if dataNumber, ok := data.(int32); ok {
|
||||
return int64(dataNumber), nil
|
||||
}
|
||||
retVal, err := dataNumber.Int64()
|
||||
if err != nil {
|
||||
return num, err
|
||||
if dataNumber, ok := data.(int16); ok {
|
||||
return int64(dataNumber), nil
|
||||
}
|
||||
return retVal, nil
|
||||
if dataNumber, ok := data.(int8); ok {
|
||||
return int64(dataNumber), nil
|
||||
}
|
||||
if dataNumber, ok := data.(json.Number); ok {
|
||||
return dataNumber.Int64()
|
||||
}
|
||||
if str, ok := data.(string); ok {
|
||||
return Str2Int64WithDefault(str, 0), nil
|
||||
}
|
||||
return 0, fmt.Errorf("data is not json.Number, it's %s, value:%v", reflect.TypeOf(data).String(), data)
|
||||
}
|
||||
|
||||
func MustInterface2Int64(data interface{}) int64 {
|
||||
@@ -114,15 +122,13 @@ func TryInterface2Float64(data interface{}) (num float64, err error) {
|
||||
if dataNumber, ok := data.(float32); ok {
|
||||
return float64(dataNumber), nil
|
||||
}
|
||||
dataNumber, ok := data.(json.Number)
|
||||
if !ok {
|
||||
return num, fmt.Errorf("data is not json.Number:%v", data)
|
||||
if dataNumber, ok := data.(json.Number); ok {
|
||||
return dataNumber.Float64()
|
||||
}
|
||||
retVal, err := dataNumber.Float64()
|
||||
if err != nil {
|
||||
return num, err
|
||||
if str, ok := data.(string); ok {
|
||||
return Str2Float64WithDefault(str, 0), nil
|
||||
}
|
||||
return retVal, nil
|
||||
return 0, fmt.Errorf("data is not json.Number, it's %s, value:%v", reflect.TypeOf(data).String(), data)
|
||||
}
|
||||
|
||||
func MustInterface2Float64(data interface{}) float64 {
|
||||
@@ -329,6 +335,10 @@ func IsTimeZero(timeValue time.Time) bool {
|
||||
return timeValue == DefaultTimeValue || timeValue == ZeroTimeValue
|
||||
}
|
||||
|
||||
func IsPtrTimeZero(timePtr *time.Time) bool {
|
||||
return timePtr == nil || *timePtr == DefaultTimeValue || *timePtr == ZeroTimeValue
|
||||
}
|
||||
|
||||
func HTTPBody2Values(data []byte, needDecode bool) (url.Values, error) {
|
||||
bodyStr := string(data)
|
||||
if needDecode {
|
||||
@@ -443,36 +453,22 @@ func MergeMaps(firstMap map[string]interface{}, otherMaps ...map[string]interfac
|
||||
return retVal
|
||||
}
|
||||
|
||||
func Struct2MapByJson(obj interface{}) (mapData map[string]interface{}) {
|
||||
func Struct2Map(obj interface{}, tagName string, isFlattenAnonymous bool) (mapData map[string]interface{}) {
|
||||
if tagName == "" {
|
||||
tagName = "json"
|
||||
}
|
||||
structsObj := structs.New(obj)
|
||||
structsObj.TagName = "json"
|
||||
structsObj.TagName = tagName
|
||||
structsObj.IsFlattenAnonymous = true
|
||||
return structsObj.Map()
|
||||
}
|
||||
|
||||
// 此函数将MAP中所有的子MAP中的数据提升到最上层,相同字段会覆盖父MAP的
|
||||
func FlatMap(in map[string]interface{}) map[string]interface{} {
|
||||
keys := []string{}
|
||||
maps := []map[string]interface{}{}
|
||||
for k, v := range in {
|
||||
if vMap, ok := v.(map[string]interface{}); ok {
|
||||
vMap = FlatMap(vMap)
|
||||
maps = append(maps, vMap)
|
||||
keys = append(keys, k)
|
||||
}
|
||||
}
|
||||
if len(maps) > 0 {
|
||||
retVal := MergeMaps(in, maps...)
|
||||
for _, v := range keys {
|
||||
delete(retVal, v)
|
||||
}
|
||||
return retVal
|
||||
}
|
||||
return in
|
||||
func Struct2MapByJson(obj interface{}) (mapData map[string]interface{}) {
|
||||
return Struct2Map(obj, "", false)
|
||||
}
|
||||
|
||||
func Struct2FlatMap(obj interface{}) map[string]interface{} {
|
||||
m := Struct2MapByJson(obj)
|
||||
return FlatMap(m)
|
||||
return Struct2Map(obj, "", true)
|
||||
}
|
||||
|
||||
// !!! 此函数好像不支持struct是内嵌结构的
|
||||
|
||||
@@ -84,3 +84,40 @@ func TestTime(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestStruct2MapByJson(t *testing.T) {
|
||||
type InnerKK struct {
|
||||
IntData int
|
||||
StrData string
|
||||
ObjData time.Time
|
||||
}
|
||||
type KK struct {
|
||||
IntData int
|
||||
A int
|
||||
B string
|
||||
C time.Time
|
||||
InnerKK
|
||||
InnerKK2 InnerKK
|
||||
}
|
||||
kk := &KK{
|
||||
InnerKK: InnerKK{
|
||||
IntData: 1,
|
||||
StrData: "hello",
|
||||
},
|
||||
}
|
||||
mapData := Struct2MapByJson(kk)
|
||||
t.Log(Format4Output(mapData, false))
|
||||
// t.Log(mapData)
|
||||
// t.Log(kk)
|
||||
}
|
||||
|
||||
// func TestStruct2MapByJson(t *testing.T) {
|
||||
// mapData := Struct2MapByJson(&struct {
|
||||
// IntData int `structs:"dataInt"`
|
||||
// StrData string `json:"-"`
|
||||
// }{
|
||||
// IntData: 1,
|
||||
// StrData: "2",
|
||||
// })
|
||||
// t.Log(mapData)
|
||||
// }
|
||||
|
||||
@@ -175,17 +175,6 @@ func TestTrimBlanChar(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestStruct2MapByJson(t *testing.T) {
|
||||
mapData := Struct2MapByJson(&struct {
|
||||
IntData int `structs:"dataInt"`
|
||||
StrData string `json:"-"`
|
||||
}{
|
||||
IntData: 1,
|
||||
StrData: "2",
|
||||
})
|
||||
t.Log(mapData)
|
||||
}
|
||||
|
||||
func TestLimitUTF8StringLen(t *testing.T) {
|
||||
for _, v := range [][]interface{}{
|
||||
[]interface{}{
|
||||
|
||||
69
utils/utils_type.go
Normal file
69
utils/utils_type.go
Normal file
@@ -0,0 +1,69 @@
|
||||
package utils
|
||||
|
||||
import "time"
|
||||
|
||||
func String2Pointer(value string) *string {
|
||||
return &value
|
||||
}
|
||||
|
||||
func Pointer2String(ptr *string) (value string) {
|
||||
if ptr != nil {
|
||||
value = *ptr
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
func Int2Pointer(value int) *int {
|
||||
return &value
|
||||
}
|
||||
|
||||
func Pointer2Int(ptr *int) (value int) {
|
||||
if ptr != nil {
|
||||
value = *ptr
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
func Int64ToPointer(value int64) *int64 {
|
||||
return &value
|
||||
}
|
||||
|
||||
func Pointer2Int64(ptr *int64) (value int64) {
|
||||
if ptr != nil {
|
||||
value = *ptr
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
func Float32ToPointer(value float32) *float32 {
|
||||
return &value
|
||||
}
|
||||
|
||||
func Pointer2Float32(ptr *float32) (value float32) {
|
||||
if ptr != nil {
|
||||
value = *ptr
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
func Float64ToPointer(value float64) *float64 {
|
||||
return &value
|
||||
}
|
||||
|
||||
func Pointer2Float64(ptr *float64) (value float64) {
|
||||
if ptr != nil {
|
||||
value = *ptr
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
func Time2Pointer(value time.Time) *time.Time {
|
||||
return &value
|
||||
}
|
||||
|
||||
func Pointer2Time(ptr *time.Time) (value time.Time) {
|
||||
if ptr != nil {
|
||||
value = *ptr
|
||||
}
|
||||
return value
|
||||
}
|
||||
Reference in New Issue
Block a user