Is it possible to reflect on a field of a struct, and get a reference to its tag values?
For example:
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
}
From what I can see, the usual way to do this is to range over typ.NumField()
, and then call field.Tag.Get("tagname")
.
However, in my use-case, it would be much better to not have to pass the whole struct in.
You don't need to pass in the whole struct, but passing in the value of one of the fields is not sufficient.
In your example user.name
field is just a string
- the reflect package will have no way of correlating that back to the original struct.
Instead, you need to pass around the reflect.StructField
for the given field:
field, ok := reflect.TypeOf(user).Elem().FieldByName("name")
…
tag = string(field.Tag)
Note: we use Elem
above because user
is a pointer to a struct.