之前发现Field的Tag信息是可修改的,然后真正在用的时候,发现只是修改了当前Field中的StructTag副本,原始信息本未修改。

原文地址:go语言反射遇到的几个问题

验证代码:
[code]
tc := make(map[reflect.Type]int64)
testInfo := TestInfo{}
{
t := reflect.TypeOf(testInfo)
i, had := tc[t]
if had {
fmt.Println("had", t, i)
} else {
i = time.Now().UnixNano()
tc[t] = i
fmt.Println("add", t, i)
}
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
j := f.Tag.Get("json")
if j == "" {
lname := strings.ToLower(f.Name)
f.Tag = reflect.StructTag(`json:"` + lname + `"`)
fmt.Println("set", f.Name, f.Tag.Get("json"))
} else {
fmt.Println("had", f.Name, f.Tag.Get("json"))
}

}
}
{
t := reflect.TypeOf(testInfo)
i, had := tc[t]
if had {
fmt.Println("had", t, i)
} else {
i = time.Now().UnixNano()
tc[t] = i
fmt.Println("add", t, i)
}
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
j := f.Tag.Get("json")
if j == "" {
lname := strings.ToLower(f.Name)
f.Tag = reflect.StructTag(`json:"` + lname + `"`)
fmt.Println("set", f.Name, f.Tag.Get("json"))
} else {
fmt.Println("had", f.Name, f.Tag.Get("json"))
}
}
}
[/code]
其中 TestInfo定义如下
[code]
type TestInfo struct {
TestId int32
TestName string
Ext TestInfoExt
}
type TestInfoExt struct {
ExtId int32
ExtName string
}
[/code]

执行结果
[code]
add main.TestInfo 1494842936946249300
set TestId testid
set TestName testname
set Ext ext
had main.TestInfo 1494842936946249300
set TestId testid
set TestName testname
set Ext ext
[/code]
两轮对Field的Tag中json的检查都是set,不是had,说明未真正生效。

标签: go, StructTag

添加新评论