从 Go 结构中提取标签作为 reflect.Value

Extract tags from Go struct as a reflect.Value

我正在尝试从作为结构的特定值中提取标签。我能够获取结构的字段但无法提取标签。我在这里做错了什么?我尝试了很多不同的方法(使用 reflect.Type、interface{} 等)但都失败了。


type House struct {
    Room string
    Humans Human
}

type Human struct {
    Name         string `anonymize:"true"` // Unable to get this tag
    Body         string
    Tail         string `anonymize:"true"` // Unable to get this tag
}

func printStructTags(f reflect.Value) { // f is of struct type `human`
    for i := 0; i < f.NumField(); i++ {
        fmt.Printf("Tags are %s\n", reflect.TypeOf(f).Field(i).Tag) // TAGS AREN'T PRINTED
    }
}

我使用reflect.Value作为参数的原因是因为这个函数是通过以下方式从另一个函数调用的

    var payload interface{}
    payload = &House{}
    // Setup complete
    v := reflect.ValueOf(payload).Elem()
    for j := 0; j < v.NumField(); j++ { // Go through all fields of payload
        f := v.Field(j)
        if f.Kind().String() == "struct" { 
            printStructTags(f)
        }
    }

任何见解都将非常有价值

当您调用 reflect.TypeOf(f) 时,您会得到 f 的类型,它已经是 reflect.Value

使用此 fType() 函数获取类型并对其进行字段检查:

func printStructTags(f reflect.Value) { // f is of struct type `human`
    for i := 0; i < f.NumField(); i++ {
        fmt.Printf("Tags are %s\n", f.Type().Field(i).Tag) 
    }
}

但是,使用 f.Type().Field(i).Tag.Get("anonymize") 可以更轻松地检查标签并获取其值。这样您就可以直接获得分配的值,例如 true 在您的情况下,如果标签不存在则为空字符串。