这段代码是:
package main
import (
"fmt"
"reflect"
"github.com/fatih/structtag"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Address string `json:"address"`
}
func main() {
p := &Person{
Name: "John",
Age: 30,
Address: "123 Main St",
}
p.setTag("Name","newtag")
p.read1Tag ("Name")
}
func (p* Person) setTag(fieldName string,tagValue string){
field, _ := reflect.TypeOf(*p).FieldByName(fieldName)
tags, _ := structtag.Parse(string(field.Tag))
tags.Delete("json")
tag := &structtag.Tag{
Key: "json",
Name: tagValue,
}
tags.Set(tag)
field.Tag = reflect.StructTag(tags.String())
tag1, _ := tags.Get("json")
fmt.Println (tag1)
field.Tag = reflect.StructTag(tags.String())
}
func (p Person) read1Tag (fieldName string) {
field, _ := reflect.TypeOf(p).FieldByName(fieldName)
tags, _ := structtag.Parse(string(field.Tag))
tag, _ := tags.Get("json")
fmt.Println (tag)
}
我想修改一个json标签的结构人,字段名称.代码,修改标签内的setTaG()函数,但当我试图读取它从主我有旧的标签(我有println标签内的两个函数).我已经定义了处理程序的引用,有人可以帮助我,维护标签的函数?谢谢.
我试着运行代码,我想把修改后的标签从setTag()中删除;所以当我重读它的时候,我想看到标签的新值。
1条答案
按热度按时间lmyy7pcs1#
你不能用那个库修改
p
的标签,我不建议你尝试它。structtag.Tag
和原始的struct
没有关系-你传递一个标签string
来解析,它可以来自任何地方,就structtag
而言。所以,你要做的是:创建一个方法,如
在这里,你从
Person
中解析标签,修改这些解析的标签并返回它们(作为adjustedTags
)。使用这些adjustedTags
作为你进一步的逻辑,如果需要的话,传递它们。您甚至可以更进一步,只创建一个方法,如
以支持任何带标记的结构,因为它与
Person
没有任何关系。