diff --git a/pkg/logger/logger_test.go b/pkg/logger/logger_test.go new file mode 100644 index 0000000..233ebdd --- /dev/null +++ b/pkg/logger/logger_test.go @@ -0,0 +1,39 @@ +package logger + +import ( + "fmt" + "testing" + + . "github.com/smartystreets/goconvey/convey" +) + +func Test_FormatStruct(t *testing.T) { + Convey("检查输出格式", t, func() { + + type Struct2 struct { + Int int + } + + type Struct struct { + Arr []int + NilArr []int + FixedArr [5]int + St2 Struct2 + St2Ptr *Struct2 + NilSt2Ptr *Struct2 + } + + So(fmt.Sprintf("%v", FormatStruct(Struct{ + Arr: []int{1, 2, 3, 4}, + NilArr: nil, + FixedArr: [5]int{1, 2, 3, 4, 5}, + St2: Struct2{ + Int: 123, + }, + St2Ptr: &Struct2{ + Int: 456, + }, + NilSt2Ptr: nil, + })), ShouldEqual, "len(Arr): 4, len(NilArr): 0, len(FixedArr): 5, St2: , St2Ptr: &, NilSt2Ptr: ") + }) +} diff --git a/pkg/logger/utils.go b/pkg/logger/utils.go new file mode 100644 index 0000000..0b14051 --- /dev/null +++ b/pkg/logger/utils.go @@ -0,0 +1,83 @@ +package logger + +import ( + "fmt" + "reflect" + "strings" +) + +type structFormatter struct { + val any +} + +func (f *structFormatter) String() string { + typ := reflect.TypeOf(f.val) + val := reflect.ValueOf(f.val) + + kind := typ.Kind() + + if kind != reflect.Struct { + return fmt.Sprintf("%v", f.val) + } + + strBuilder := strings.Builder{} + for i := 0; i < val.NumField(); i++ { + fieldInfo := typ.Field(i) + fieldValue := val.Field(i) + fieldType := fieldInfo.Type + fieldKind := fieldType.Kind() + + switch fieldKind { + case reflect.Slice: + fallthrough + case reflect.Array: + if i > 0 { + strBuilder.WriteString(", ") + } + + strBuilder.WriteString("len(") + strBuilder.WriteString(fieldInfo.Name) + strBuilder.WriteString("): ") + strBuilder.WriteString(fmt.Sprintf("%d", fieldValue.Len())) + + case reflect.Struct: + if i > 0 { + strBuilder.WriteString(", ") + } + + strBuilder.WriteString(fieldInfo.Name) + strBuilder.WriteString(": <") + strBuilder.WriteString(fieldType.Name()) + strBuilder.WriteString(">") + + case reflect.Pointer: + if i > 0 { + strBuilder.WriteString(", ") + } + strBuilder.WriteString(fieldInfo.Name) + if fieldValue.IsNil() { + strBuilder.WriteString(": ") + } else { + strBuilder.WriteString(": &<") + strBuilder.WriteString(fieldType.Elem().Name()) + strBuilder.WriteString(">") + } + + default: + if i > 0 { + strBuilder.WriteString(", ") + } + strBuilder.WriteString(fieldInfo.Name) + strBuilder.WriteString(": ") + strBuilder.WriteString(fmt.Sprintf("%v", fieldValue)) + } + } + + return strBuilder.String() +} + +func FormatStruct(val any) any { + return &structFormatter{ + val: val, + } +}