Структурні теги в GO

У 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"`
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься.