使用 Go 反射包获取结构字段标签

新手上路,请多包涵

是否可以反映结构的字段,并获得对其标记值的引用?

例如:

 type User struct {
    name    string `json:name-field`
    age     int
}
// ...
user := &User{"John Doe The Fourth", 20}
getStructTag(user.name)
// ...
func getStructTag(i interface{}) string{
   //get tag from field

}

据我所知,执行此操作的通常方法是范围超过 typ.NumField() ,然后调用 field.Tag.Get("tagname")

但是,在我的用例中,不必传入整个结构会好得多。

原文由 Jameo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 519
2 个回答

您不需要传递整个结构,但传递其中一个字段的值是不够的。

在您的示例中 user.name 字段只是一个 string 反射包将无法将其关联回原始结构。

相反,您需要为给定字段传递 reflect.StructField

 field, ok := reflect.TypeOf(user).Elem().FieldByName("name")
…
tag = string(field.Tag)

注意:我们在上面使用 Elem 因为 user 是一个指向结构的指针。

你可以在这里玩一个例子。

原文由 djd 发布,翻译遵循 CC BY-SA 4.0 许可协议

修改上面的答案可以给出特定标签的值

package main

import (
    "fmt"
    "reflect"
)

type User struct {
    Name string `json:"name_field"`
    Age  int
}

func main() {
    user := &User{"John Doe The Fourth", 20}

    field, ok := reflect.TypeOf(user).Elem().FieldByName("Name")
    if !ok {
        panic("Field not found")
    }
    fmt.Println(getStructTag(field, "json")) //name_field
}

func getStructTag(f reflect.StructField, tagName string) string {
    return string(f.Tag.Get(tagName))
}

https://play.golang.org/p/Sb0i7za5Uow

原文由 Raj Nandan Sharma 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题