代码拉取完成,页面将自动刷新
// Package gutil provides utility functions.
package gutil
import (
"fmt"
"gitee.com/micro-tools/wf/internal/empty"
"gitee.com/micro-tools/wf/util/gconv"
"reflect"
)
// Throw throws out an exception, which can be caught be TryCatch or recover.
func Throw(exception interface{}) {
panic(exception)
}
// Try implements try... logistics using internal panic...recover.
// It returns error if any exception occurs, or else it returns nil.
func Try(try func()) (err error) {
defer func() {
if e := recover(); e != nil {
err = fmt.Errorf(`%v`, e)
}
}()
try()
return
}
// TryCatch implements try...catch... logistics using internal panic...recover.
// It automatically calls function `catch` if any exception occurs ans passes the exception as an error.
func TryCatch(try func(), catch ...func(exception error)) {
defer func() {
if exception := recover(); exception != nil && len(catch) > 0 {
if err, ok := exception.(error); ok {
catch[0](err)
} else {
catch[0](fmt.Errorf(`%v`, exception))
}
}
}()
try()
}
// IsEmpty checks given `value` empty or not.
// It returns false if `value` is: integer(0), bool(false), slice/map(len=0), nil;
// or else returns true.
func IsEmpty(value interface{}) bool {
return empty.IsEmpty(value)
}
// Keys retrieves and returns the keys from given map or struct.
func Keys(mapOrStruct interface{}) (keysOrAttrs []string) {
keysOrAttrs = make([]string, 0)
if m, ok := mapOrStruct.(map[string]interface{}); ok {
for k, _ := range m {
keysOrAttrs = append(keysOrAttrs, k)
}
return
}
var (
reflectValue reflect.Value
reflectKind reflect.Kind
)
if v, ok := mapOrStruct.(reflect.Value); ok {
reflectValue = v
} else {
reflectValue = reflect.ValueOf(mapOrStruct)
}
reflectKind = reflectValue.Kind()
for reflectKind == reflect.Ptr {
if !reflectValue.IsValid() || reflectValue.IsNil() {
reflectValue = reflect.New(reflectValue.Type().Elem()).Elem()
reflectKind = reflectValue.Kind()
} else {
reflectValue = reflectValue.Elem()
reflectKind = reflectValue.Kind()
}
}
switch reflectKind {
case reflect.Map:
for _, k := range reflectValue.MapKeys() {
keysOrAttrs = append(keysOrAttrs, gconv.String(k.Interface()))
}
case reflect.Struct:
var (
fieldType reflect.StructField
reflectType = reflectValue.Type()
)
for i := 0; i < reflectValue.NumField(); i++ {
fieldType = reflectType.Field(i)
if fieldType.Anonymous {
keysOrAttrs = append(keysOrAttrs, Keys(reflectValue.Field(i))...)
} else {
keysOrAttrs = append(keysOrAttrs, fieldType.Name)
}
}
}
return
}
// Values retrieves and returns the values from given map or struct.
func Values(mapOrStruct interface{}) (values []interface{}) {
values = make([]interface{}, 0)
if m, ok := mapOrStruct.(map[string]interface{}); ok {
for _, v := range m {
values = append(values, v)
}
return
}
var (
reflectValue reflect.Value
reflectKind reflect.Kind
)
if v, ok := mapOrStruct.(reflect.Value); ok {
reflectValue = v
} else {
reflectValue = reflect.ValueOf(mapOrStruct)
}
reflectKind = reflectValue.Kind()
for reflectKind == reflect.Ptr {
reflectValue = reflectValue.Elem()
reflectKind = reflectValue.Kind()
}
switch reflectKind {
case reflect.Map:
for _, k := range reflectValue.MapKeys() {
values = append(values, reflectValue.MapIndex(k).Interface())
}
case reflect.Struct:
var (
fieldType reflect.StructField
reflectType = reflectValue.Type()
)
for i := 0; i < reflectValue.NumField(); i++ {
fieldType = reflectType.Field(i)
if fieldType.Anonymous {
values = append(values, Values(reflectValue.Field(i))...)
} else {
values = append(values, reflectValue.Field(i).Interface())
}
}
}
return
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。