Search code examples
reflectionstructgo

Get struct field tag using Go reflect package


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.


Solution

  • 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.

    You can play with an example here.