You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

utils.go 1.6 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package logger
  2. import (
  3. "fmt"
  4. "reflect"
  5. "strings"
  6. )
  7. type structFormatter struct {
  8. val any
  9. }
  10. func (f *structFormatter) String() string {
  11. typ := reflect.TypeOf(f.val)
  12. val := reflect.ValueOf(f.val)
  13. kind := typ.Kind()
  14. if kind != reflect.Struct {
  15. return fmt.Sprintf("%v", f.val)
  16. }
  17. strBuilder := strings.Builder{}
  18. for i := 0; i < val.NumField(); i++ {
  19. fieldInfo := typ.Field(i)
  20. fieldValue := val.Field(i)
  21. fieldType := fieldInfo.Type
  22. fieldKind := fieldType.Kind()
  23. switch fieldKind {
  24. case reflect.Slice:
  25. fallthrough
  26. case reflect.Array:
  27. if i > 0 {
  28. strBuilder.WriteString(", ")
  29. }
  30. strBuilder.WriteString("len(")
  31. strBuilder.WriteString(fieldInfo.Name)
  32. strBuilder.WriteString("): ")
  33. strBuilder.WriteString(fmt.Sprintf("%d", fieldValue.Len()))
  34. case reflect.Struct:
  35. if i > 0 {
  36. strBuilder.WriteString(", ")
  37. }
  38. strBuilder.WriteString(fieldInfo.Name)
  39. strBuilder.WriteString(": <")
  40. strBuilder.WriteString(fieldType.Name())
  41. strBuilder.WriteString(">")
  42. case reflect.Pointer:
  43. if i > 0 {
  44. strBuilder.WriteString(", ")
  45. }
  46. strBuilder.WriteString(fieldInfo.Name)
  47. if fieldValue.IsNil() {
  48. strBuilder.WriteString(": <nil>")
  49. } else {
  50. strBuilder.WriteString(": &<")
  51. strBuilder.WriteString(fieldType.Elem().Name())
  52. strBuilder.WriteString(">")
  53. }
  54. default:
  55. if i > 0 {
  56. strBuilder.WriteString(", ")
  57. }
  58. strBuilder.WriteString(fieldInfo.Name)
  59. strBuilder.WriteString(": ")
  60. strBuilder.WriteString(fmt.Sprintf("%v", fieldValue))
  61. }
  62. }
  63. return strBuilder.String()
  64. }
  65. func FormatStruct(val any) any {
  66. return &structFormatter{
  67. val: val,
  68. }
  69. }

公共库

Contributors (1)