structtag go包似乎没有更改函数内部的标记

w41d8nur  于 2023-03-27  发布在  Go
关注(0)|答案(1)|浏览(67)

这段代码是:

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()中删除;所以当我重读它的时候,我想看到标签的新值。

lmyy7pcs

lmyy7pcs1#

你不能用那个库修改p的标签,我不建议你尝试它。structtag.Tag和原始的struct没有关系-你传递一个标签string来解析,它可以来自任何地方,就structtag而言。
所以,你要做的是:创建一个方法,如

func (p Person) getAdjustedTags() (adjustedTags structtag.Tags)

在这里,你从Person中解析标签,修改这些解析的标签并返回它们(作为adjustedTags)。使用这些adjustedTags作为你进一步的逻辑,如果需要的话,传递它们。
您甚至可以更进一步,只创建一个方法,如

func getAdjustedTags(withTags any) (adjustedTags structtag.Tags)

以支持任何带标记的结构,因为它与Person没有任何关系。

相关问题