mirror of
https://github.com/unti-io/go-utils.git
synced 2025-10-05 08:16:50 +08:00
216 lines
5.4 KiB
Go
216 lines
5.4 KiB
Go
package utils
|
|
|
|
import (
|
|
"reflect"
|
|
|
|
"github.com/spf13/cast"
|
|
)
|
|
|
|
// Struct - 操作结构体
|
|
var Struct *StructClass
|
|
|
|
type StructClass struct {}
|
|
|
|
// Set - 动态给结构体赋值
|
|
func (this *StructClass) Set(obj any, key string, val any) {
|
|
// 获取结构体的值
|
|
value := reflect.ValueOf(obj).Elem()
|
|
// 获取结构体的类型
|
|
typ := value.Type()
|
|
// 遍历结构体的字段
|
|
for i := 0; i < value.NumField(); i++ {
|
|
// 获取结构体的字段
|
|
field := typ.Field(i)
|
|
// 获取字段的tag
|
|
tag := field.Tag.Get("json")
|
|
// 判断字段的tag是否等于传入的key
|
|
if tag == key {
|
|
// 类型断言
|
|
switch field.Type.Kind() {
|
|
case reflect.String:
|
|
value.Field(i).SetString(cast.ToString(val))
|
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
value.Field(i).SetInt(cast.ToInt64(val))
|
|
case reflect.Bool:
|
|
value.Field(i).SetBool(cast.ToBool(val))
|
|
case reflect.Float32, reflect.Float64:
|
|
value.Field(i).SetFloat(cast.ToFloat64(val))
|
|
default:
|
|
if val == nil {
|
|
val = reflect.Zero(field.Type).Interface()
|
|
} else {
|
|
value.Field(i).Set(reflect.ValueOf(val))
|
|
}
|
|
}
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
// Get - 动态获取结构体的值
|
|
func (this *StructClass) Get(obj any, key string) (result any) {
|
|
// 获取结构体的值
|
|
value := reflect.ValueOf(obj).Elem()
|
|
// 获取结构体的类型
|
|
typ := value.Type()
|
|
// 遍历结构体的字段
|
|
for i := 0; i < value.NumField(); i++ {
|
|
// 获取结构体的字段
|
|
field := typ.Field(i)
|
|
// 获取字段的tag
|
|
tag := field.Tag.Get("json")
|
|
// 判断字段的tag是否等于传入的key
|
|
if tag == key {
|
|
// 获取字段的值
|
|
return value.Field(i).Interface()
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Del - 删除结构体的字段
|
|
func (this *StructClass) Del(obj any, key string) {
|
|
// 获取结构体的值
|
|
value := reflect.ValueOf(obj).Elem()
|
|
// 获取结构体的类型
|
|
typ := value.Type()
|
|
// 遍历结构体的字段
|
|
for i := 0; i < value.NumField(); i++ {
|
|
// 获取结构体的字段
|
|
field := typ.Field(i)
|
|
// 获取字段的tag
|
|
tag := field.Tag.Get("json")
|
|
// 判断字段的tag是否等于传入的key
|
|
if tag == key {
|
|
// 获取字段的值
|
|
value.Field(i).Set(reflect.Zero(field.Type))
|
|
}
|
|
}
|
|
}
|
|
|
|
// Has - 判断结构体是否存在某个字段
|
|
func (this *StructClass) Has(obj any, key string) (ok bool) {
|
|
// 获取结构体的值
|
|
value := reflect.ValueOf(obj).Elem()
|
|
// 获取结构体的类型
|
|
typ := value.Type()
|
|
// 遍历结构体的字段
|
|
for i := 0; i < value.NumField(); i++ {
|
|
// 获取结构体的字段
|
|
field := typ.Field(i)
|
|
// 获取字段的tag
|
|
tag := field.Tag.Get("json")
|
|
// 判断字段的tag是否等于传入的key
|
|
if tag == key {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// Keys - 获取结构体的字段
|
|
func (this *StructClass) Keys(obj any) (slice []string) {
|
|
// 获取结构体的值
|
|
value := reflect.ValueOf(obj).Elem()
|
|
// 获取结构体的类型
|
|
typ := value.Type()
|
|
// 定义一个切片
|
|
keys := make([]string, 0)
|
|
// 遍历结构体的字段
|
|
for i := 0; i < value.NumField(); i++ {
|
|
// 获取结构体的字段
|
|
field := typ.Field(i)
|
|
// 获取字段的tag
|
|
tag := field.Tag.Get("json")
|
|
// 判断字段的tag是否等于传入的key
|
|
keys = append(keys, tag)
|
|
}
|
|
return keys
|
|
}
|
|
|
|
// Values - 获取结构体的值
|
|
func (this *StructClass) Values(obj any) (slice []any) {
|
|
// 获取结构体的值
|
|
value := reflect.ValueOf(obj).Elem()
|
|
// 定义一个切片
|
|
keys := make([]any, 0)
|
|
// 遍历结构体的字段
|
|
for i := 0; i < value.NumField(); i++ {
|
|
// 获取字段的值
|
|
keys = append(keys, value.Field(i).Interface())
|
|
}
|
|
return keys
|
|
}
|
|
|
|
// Len - 获取结构体的长度
|
|
func (this *StructClass) Len(obj any) (length int) {
|
|
// 获取结构体的值
|
|
value := reflect.ValueOf(obj).Elem()
|
|
return value.NumField()
|
|
}
|
|
|
|
// Map - 将结构体转换为map
|
|
func (this *StructClass) Map(obj any) (result map[string]any) {
|
|
// 获取结构体的值
|
|
value := reflect.ValueOf(obj).Elem()
|
|
// 获取结构体的类型
|
|
typ := value.Type()
|
|
// 定义一个map
|
|
// result := make(map[string]any)
|
|
// 遍历结构体的字段
|
|
for i := 0; i < value.NumField(); i++ {
|
|
// 获取结构体的字段
|
|
field := typ.Field(i)
|
|
// 获取字段的tag
|
|
tag := field.Tag.Get("json")
|
|
// 获取字段的值
|
|
result[tag] = value.Field(i).Interface()
|
|
}
|
|
return result
|
|
}
|
|
|
|
// Slice - 将结构体转换为切片
|
|
func (this *StructClass) Slice(obj any) (slice []any) {
|
|
// 获取结构体的值
|
|
value := reflect.ValueOf(obj).Elem()
|
|
// 定义一个切片
|
|
s := make([]any, 0)
|
|
// 遍历结构体的字段
|
|
for i := 0; i < value.NumField(); i++ {
|
|
// 获取字段的值
|
|
s = append(s, value.Field(i).Interface())
|
|
}
|
|
return s
|
|
}
|
|
|
|
// ToStringMap - 将结构体转换为map[string]any
|
|
func (this *StructClass) ToStringMap(obj any) (result map[string]any) {
|
|
return cast.ToStringMap(Json.Encode(obj))
|
|
}
|
|
|
|
// ToAsciiString - 将结构体转换为ASCII字符串
|
|
func (this *StructClass) ToAsciiString(obj any) (result string) {
|
|
return Ascii.ToString(this.ToStringMap(obj), true)
|
|
}
|
|
|
|
// Fields - 获取结构体的字段名
|
|
func (this *StructClass) Fields(dest any) []string {
|
|
|
|
// 获取结构体的反射值
|
|
item := reflect.ValueOf(dest)
|
|
// 确保传递的是一个指针
|
|
if item.Kind() == reflect.Ptr {
|
|
item = item.Elem()
|
|
}
|
|
// 确保反射值的类型是结构体
|
|
if item.Kind()!= reflect.Struct { return nil }
|
|
|
|
_type := item.Type()
|
|
field := make([]string, item.NumField())
|
|
|
|
for i := 0; i < item.NumField(); i++ {
|
|
field[i] = _type.Field(i).Name
|
|
}
|
|
|
|
return field
|
|
} |