68 lines
1.5 KiB
Go
68 lines
1.5 KiB
Go
|
package test
|
|||
|
|
|||
|
import (
|
|||
|
model "catface/app/model"
|
|||
|
"fmt"
|
|||
|
"reflect"
|
|||
|
"strings"
|
|||
|
"testing"
|
|||
|
"unicode"
|
|||
|
)
|
|||
|
|
|||
|
// 获取处理后的 json 标签值
|
|||
|
func getProcessedJSONTag(field reflect.StructField) string {
|
|||
|
jsonTag := field.Tag.Get("json")
|
|||
|
if jsonTag != "" {
|
|||
|
// 移除 omitempty
|
|||
|
jsonTag = strings.Replace(jsonTag, ",omitempty", "", -1)
|
|||
|
jsonTag = strings.Replace(jsonTag, "omitempty", "", -1)
|
|||
|
}
|
|||
|
return jsonTag
|
|||
|
}
|
|||
|
|
|||
|
func Test(tt *testing.T) {
|
|||
|
animal := model.Animal{}
|
|||
|
|
|||
|
// 获取 Animal 类型的反射类型
|
|||
|
t := reflect.TypeOf(animal)
|
|||
|
|
|||
|
// 创建一个空的 map,用于存储字段名
|
|||
|
fieldMap := make(map[string]bool)
|
|||
|
|
|||
|
// 遍历结构体的所有字段
|
|||
|
fmt.Println("All fields:", t.NumField())
|
|||
|
for i := 0; i < t.NumField(); i++ {
|
|||
|
field := t.Field(i)
|
|||
|
fieldName := field.Name
|
|||
|
|
|||
|
// 获取 json 标签中的值
|
|||
|
jsonTag := getProcessedJSONTag(field)
|
|||
|
if jsonTag != "" {
|
|||
|
// 如果有 json 标签,则使用标签中的值
|
|||
|
fieldMap[jsonTag] = true
|
|||
|
} else {
|
|||
|
// 如果没有 json 标签,则转换字段名为下划线命名
|
|||
|
convertedFieldName := camelToSnake(fieldName)
|
|||
|
fieldMap[convertedFieldName] = true
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 打印 map
|
|||
|
fmt.Println("Fields as keys:")
|
|||
|
for key := range fieldMap {
|
|||
|
fmt.Println(key)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 将驼峰命名转换为下划线命名
|
|||
|
func camelToSnake(s string) string {
|
|||
|
var result strings.Builder
|
|||
|
for i, r := range s {
|
|||
|
if i > 0 && unicode.IsUpper(r) {
|
|||
|
result.WriteRune('_')
|
|||
|
}
|
|||
|
result.WriteRune(unicode.ToLower(r))
|
|||
|
}
|
|||
|
return result.String()
|
|||
|
}
|