Struct tags là metadata gắn vào field của struct dưới dạng string literal sau tên field, được đọc tại runtime thông qua reflection.
Phổ biến nhất là JSON tags và validation tags.
type User struct {
ID int `json:"id" db:"user_id"`
Name string `json:"name" validate:"required,min=2"`
Email string `json:"email" validate:"required,email"`
Password string `json:"-"` // bỏ qua khi encode JSON
CreatedAt time.Time `json:"created_at,omitempty"` // bỏ qua nếu zero value
}
// Đọc tag lúc runtime
t := reflect.TypeOf(User{})
field, _ := t.FieldByName("Email")
fmt.Println(field.Tag.Get("json")) // "email"
fmt.Println(field.Tag.Get("validate")) // "required,email"Các tags phổ biến:
- json:"name,omitempty" — encoding/json
- db:"column_name" — sqlx, GORM
- validate:"required,min=3" — go-playground/validator
- yaml:"field_name" — gopkg.in/yaml.v3
- env:"ENV_VAR" — envconfig
Tags không ảnh hưởng đến type safety tại compile time, chỉ có ý nghĩa khi package đọc chúng qua reflection.
Struct tags are metadata annotations attached to struct fields as string literals, read at runtime via reflection.
JSON tags and validation tags are the most common.
type User struct {
ID int `json:"id" db:"user_id"`
Name string `json:"name" validate:"required,min=2"`
Email string `json:"email" validate:"required,email"`
Password string `json:"-"` // always omit from JSON
CreatedAt time.Time `json:"created_at,omitempty"` // omit if zero
}
// Read tags at runtime
t := reflect.TypeOf(User{})
field, _ := t.FieldByName("Email")
fmt.Println(field.Tag.Get("json")) // "email"
fmt.Println(field.Tag.Get("validate")) // "required,email"Common tag namespaces: json, db (sqlx/GORM), validate (go-playground/validator), yaml, env.
Tags have no effect on compile-time type safety — they only carry meaning when a package reads them via reflection.