我试图从一个 struct 的特定值中提取标记.我能够获取 struct 的字段,但无法提取标记.我做错了什么?我try 了许多不同的方法(使用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了.

使用f中的Type() func获取类型并对其进行字段判断:

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")获得其值.通过这种方式,您可以直接获得指定的值,例如,在您的 case 中是true,如果标记不存在,则获得一个空字符串.

Go相关问答推荐

VS代码,Golang格式顽固的情况与switch / case

向API网关终结点发出POST请求时出现AWS Lambda With Go:";Rune me.InvalidEntrypoint";错误

+在具有html/模板Golang的Base64中

更改位置级别和时间戳零点Golang

无法使用exec从管道中读取.Go中的命令

使用goroutines在Golang中验证 struct

Golang 网络应用程序安全性:您是否应该判断输入是否为有效的 utf-8?

Gorm 在自定义字符串类型上返回 scanner 错误

在 Cloud Run 中找不到默认凭据

使用 LINQ 对内部数组进行排序

使用 Grafana alert 在几分钟内重复alert

如何使用 fyne Go 使用 canvas.NewText() 使文本可滚动

如何在Go中替换符号并使下一个字母大写

即使一个测试用例失败,如何运行所有测试用例

无限期运行 Go routine (完成后重新启动)

跟踪长时间运行的任务的进度 - 正确的方法

Terraform 自定义提供程序 - 数据源架构

具有多个嵌入式 struct 的 Go MarshalJSON 行为

Go generics:我会在哪里使用 any 而不是 interface{}?

即使没有竞争条件也没有得到任何输出