What are tags in Golang?

Overview

In Golang, we use Tags as metadata to provide for each field in a struct. This information is made available using reflection.

This is typically used by packages that transform data from one form to another. For example, we can use Tags to encode/decode JSON data or read and write from a DB.

Example

Let’s see an example.

package main
import "fmt"
type Employee struct {
Id int64 `db:"id"`
Firstname string `db:"firstname"`
Lastname string `db:"lastname"`
}
type EmpJson struct {
Id int64 `json:"id"`
Firstname string `json:"firstname"`
Lastname string `json:"lastname"`
}

Explanation

The above code snippet defines two structs. The first struct, Employee, defines the tags with the prefix db for each field. The second struct, EmpJson, defines the tags with the prefix json for each field.

As we can see, the tag is defined in a typical key:value manner. The key is usually the package name for which the value is. That is, the fields with the tags as json:"***" are to be used by the package json. The fields with the tags as db:"***" are to be used by the db package.

Custom tags

We can add custom tags, and we use the reflect package to access these in our code.

package main
import (
"fmt"
"reflect"
)
func main() {
type Me struct {
Firstname string `mytag:"FirstName"`
Lastname string `mytag:"LastName"`
}
m := Me{"Anjana", "Shankar"}
t := reflect.TypeOf(m)
for _, fieldName := range []string{"Firstname", "Lastname"} {
field, found := t.FieldByName(fieldName)
if !found {
continue
}
fmt.Printf("\nField: Me.%s\n", fieldName)
fmt.Printf("\tWhole tag value : %q\n", field.Tag)
fmt.Printf("\tValue of 'mytag': %q\n", field.Tag.Get("mytag"))
}
}

Conclusion

Tags can be used by a package that it is meant for. It is otherwise totally ignored.

Free Resources