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()
|
||
}
|