| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 | 
							- package gio
 
- import (
 
- 	"encoding/json"
 
- 	"fmt"
 
- 	"io"
 
- 	"reflect"
 
- 	"runtime"
 
- 	"strings"
 
- )
 
- func ReadLimit(r io.Reader, n int64) ([]byte, error) {
 
- 	if n == 0 {
 
- 		n = 4096
 
- 	}
 
- 	return io.ReadAll(io.LimitReader(r, n))
 
- }
 
- func CallFuncName(skip int) string {
 
- 	pc, _, _, _ := runtime.Caller(skip + 1)
 
- 	funcName := runtime.FuncForPC(pc).Name()
 
- 	return funcName[strings.LastIndex(funcName, ".")+1:]
 
- }
 
- func StructToMap(obj any) (map[string]any, error) {
 
- 	// 获取反射值
 
- 	val := reflect.ValueOf(obj)
 
- 	if val.Kind() == reflect.Ptr {
 
- 		val = val.Elem()
 
- 	}
 
- 	// 确保输入是结构体
 
- 	if val.Kind() != reflect.Struct {
 
- 		return nil, fmt.Errorf("input must be a struct or struct pointer")
 
- 	}
 
- 	// 创建结果 map
 
- 	result := make(map[string]any)
 
- 	typ := val.Type()
 
- 	// 遍历结构体的字段
 
- 	for i := 0; i < val.NumField(); i++ {
 
- 		field := typ.Field(i)
 
- 		fieldVal := val.Field(i)
 
- 		// 获取 json 标签
 
- 		jsonTag := field.Tag.Get("json")
 
- 		if jsonTag == "" {
 
- 			jsonTag = field.Name
 
- 		} else {
 
- 			if idx := strings.Index(jsonTag, ","); idx != -1 {
 
- 				jsonTag = jsonTag[:idx]
 
- 			}
 
- 		}
 
- 		// 跳过忽略字段或无效字段
 
- 		if jsonTag == "-" || !fieldVal.IsValid() {
 
- 			continue
 
- 		}
 
- 		// 检查字段是否为结构体或结构体指针,且是否有 json 标签
 
- 		hasJsonTag := field.Tag.Get("json") != ""
 
- 		if (fieldVal.Kind() == reflect.Struct || (fieldVal.Kind() == reflect.Ptr && !fieldVal.IsNil() && fieldVal.Elem().Kind() == reflect.Struct)) && !hasJsonTag {
 
- 			// 如果是结构体且无 json 标签,递归展开
 
- 			var nestedVal interface{}
 
- 			if fieldVal.Kind() == reflect.Ptr {
 
- 				nestedVal = fieldVal.Interface()
 
- 			} else {
 
- 				nestedVal = fieldVal.Interface()
 
- 			}
 
- 			nestedMap, err := StructToMap(nestedVal)
 
- 			if err != nil {
 
- 				return nil, err
 
- 			}
 
- 			for k, v := range nestedMap {
 
- 				result[k] = v
 
- 			}
 
- 		} else {
 
- 			// 其他情况(包括有 json 标签的嵌套结构体),直接存储字段值
 
- 			result[jsonTag] = fieldVal.Interface()
 
- 		}
 
- 	}
 
- 	return result, nil
 
- }
 
- func DecodeJson[T any](v any) (T, error) {
 
- 	var t T
 
- 	b, err := json.Marshal(v)
 
- 	if err != nil {
 
- 		return t, err
 
- 	}
 
- 	if err = json.Unmarshal(b, &t); err != nil {
 
- 		return t, err
 
- 	}
 
- 	return t, nil
 
- }
 
- func Equal(a, b any) bool {
 
- 	if a == nil && b == nil {
 
- 		return true
 
- 	}
 
- 	if a == nil || b == nil {
 
- 		return false
 
- 	}
 
- 	return reflect.DeepEqual(a, b)
 
- }
 
 
  |