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 2.0 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 f.structString(val)
  16. }
  17. if kind == reflect.Pointer {
  18. return f.structString(val.Elem())
  19. }
  20. return fmt.Sprintf("%v", f.val)
  21. }
  22. func (f *structFormatter) structString(val reflect.Value) string {
  23. typ := val.Type()
  24. strBuilder := strings.Builder{}
  25. for i := 0; i < val.NumField(); i++ {
  26. fieldInfo := typ.Field(i)
  27. fieldValue := val.Field(i)
  28. fieldType := fieldInfo.Type
  29. fieldKind := fieldType.Kind()
  30. switch fieldKind {
  31. case reflect.Slice:
  32. fallthrough
  33. case reflect.Array:
  34. if i > 0 {
  35. strBuilder.WriteString(", ")
  36. }
  37. strBuilder.WriteString("len(")
  38. strBuilder.WriteString(fieldInfo.Name)
  39. strBuilder.WriteString("): ")
  40. strBuilder.WriteString(fmt.Sprintf("%d", fieldValue.Len()))
  41. case reflect.Struct:
  42. if i > 0 {
  43. strBuilder.WriteString(", ")
  44. }
  45. strBuilder.WriteString(fieldInfo.Name)
  46. strBuilder.WriteString(": <")
  47. strBuilder.WriteString(fieldType.Name())
  48. strBuilder.WriteString(">")
  49. case reflect.Pointer:
  50. if i > 0 {
  51. strBuilder.WriteString(", ")
  52. }
  53. strBuilder.WriteString(fieldInfo.Name)
  54. if fieldValue.IsNil() {
  55. strBuilder.WriteString(": <nil>")
  56. } else {
  57. strBuilder.WriteString(": &<")
  58. strBuilder.WriteString(fieldType.Elem().Name())
  59. strBuilder.WriteString(">")
  60. }
  61. default:
  62. if i > 0 {
  63. strBuilder.WriteString(", ")
  64. }
  65. strBuilder.WriteString(fieldInfo.Name)
  66. strBuilder.WriteString(": ")
  67. strBuilder.WriteString(fmt.Sprintf("%v", fieldValue))
  68. }
  69. }
  70. return strBuilder.String()
  71. }
  72. // FormatStruct 输出结构体的内容。
  73. // 1. 数组类型只会输出长度
  74. // 2. 内部的结构体的内容不会再输出
  75. // 3. 支持参数是一层的指针
  76. func FormatStruct(val any) any {
  77. return &structFormatter{
  78. val: val,
  79. }
  80. }

公共库

Contributors (1)