Small introduction to tags in Go

A short write-up on what tags are, and how you can leverage their strength.

July 21, 2015

Go has an awesome feature built in, namely tags. You are probably already familiar with them, they are like annotations in Java for example.

This is just a quick introduction: how to use them, and how to implement them.

First of all, a quick introduction to tags. Let’s take a look at the encoding/json package. This package makes use of tags for the marshalling and unmarshalling of structs/json.

A simple example:

type Post struct {
    Title    string `json:"title"`
    Views    int    `json:"pageviews"`
    Password string `json:"-"`
}

Because of these tags the JSON package knows that it will have to output a JSON that will look somewhat like this: { "title" : "My title", "pageviews" : 812 }

As you can see, it used the tags to produce the JSON output.

Now consider we want to build something like a validation package, that validates structs based on their tags. Imagine the following:

type Post struct {
    Title string `validation:"max_length=20 allow_blank=false"`
    Body  string `validation:"allow_blank=false"`
}

Now in order to be able to validate this struct, we will need to parse these tags first.

In order to be able to retrieve the tags of structs, we will be needing the reflect package.

The retrieval of tags is done as follows:

var post Post
modelType := reflect.TypeOf(post)

for i := 0; i < modelType.NumField(); i++ {
    field := modelType.Field(i)
    validation := field.Tag.Get("validation")
    fmt.Println(validation)
}

This will simply output the following:

max_length=20 allow_blank=false
allow_blank=false

You have now retrieved the tags for each field in the struct. From here on out you can apply whatever logic you want to apply to the struct and it’s tags, and process it in any way you see fit.