У Go існує можливість структурі прописати додаткову інформації для кожного поля в апострофах. Така додаткова інформація називається тегами. Ці мета дані можуть використовуватись в подальшому для модифікації полів структури, або ще якимось чином, який захоче розробник. Якщо ви вже працювали з го то ви напевно бачили такі конструкції.
type createProductRequest struct {
Name string `json:"name"`
Description string `json:"email"`
Image string `json:"image"`
Price int `json:"price"`
Count int `json:"count"`
}
Де json:"name"
Це є структурний тег для поля Name. В даному прикладі json це ключ тега, в частині після двокрапки описується певна сигнатура за допомогою якої код розуміє як він повинен обробити дане поле.
Щоб мати можливість працювати з цими мета даними нам допоможе пакет reflect з стандартної бібліотеки GO
Наприклад нам потрібний такий функціонал: мати можливість кожному полю структури прописувати коментар. Отже ключовим словом для тегу буде commen. І для прикладу створимо таку структуру.
type person struct {
id int `comment:"Identification number"`
name string `comment:"Full name person"`
phone string `comment:"Phone number of person"`
ip string `comment:"IP address when person registration"`
}
У функції main створимо змінну типу person і заповним її якимись даними.
p := person{
id: 1,
name: "John Doe",
phone: "+123456789",
ip: "85.12.35.158",
}
Візмем нульове значення нашої структури і тип
pValue := reflect.ValueOf(p)
pType := reflect.TypeOf(p)
А тепер перейдемось по всіх полях структури і прочитаєм наші тег, значення поля і тегу виведем в консоль.
for i := 0; i < pValue.NumField(); i++ {
field := pType.Field(i)
if comment, ok := field.Tag.Lookup("comment"); ok {
fmt.Printf("%s: %v\n", comment, pValue.Field(i))
}
}
Тепер запустим програму і консолі ми побачимо наступний результат.
Identification number: 1
Full name person: John Doe
Phone number of person: +123456789
IP address when person registration: 85.12.35.158
Зразок коду можна побачити у репозиторії struct-tags. Також одне поле структури може мати декілька тегів.
type example struct{
id int `tag1:"action1" tag2:"action2"`
}