0

Получение тега поля структуры с использованием пакета reflect в Go

9

Заголовок: Как получить значение тега поля структуры в Go, не передавая всю структуру?

Описание проблемы:

В Go есть возможность отражения, и я хотел бы узнать, возможно ли получить доступ к значениям тегов конкретного поля структуры, не передавая всю структуру.

Рассмотрим следующий пример:

type User struct {
    name string `json:"name-field"`
    age  int
}

// ...
user := &User{"John Doe The Fourth", 20}
getStructTag(user.name)
// ...
func getStructTag(i interface{}) string {
    // здесь нужно получить тег из поля
}

Как я понимаю, обычный способ получения тегов заключается в переборе полей структуры с помощью typ.NumField() и вызова field.Tag.Get("tagname"). Однако в моем случае было бы гораздо удобнее избежать передачи всей структуры и работать только с конкретным полем.

Существует ли способ сделать это в Go? Если да, то как?

2 ответ(ов)

0

Чтобы модифицировать приведённый код и получить значение определённого тега, вы можете использовать следующий подход:

package main

import (
    "fmt"
    "reflect"
)

type User struct {
    Name string `json:"name_field"`
    Age  int
}

func main() {
    user := &User{"John Doe The Fourth", 20}

    // Получаем тип структуры и находим поле по имени
    field, ok := reflect.TypeOf(user).Elem().FieldByName("Name")
    if !ok {
        panic("Поле не найдено")
    }
    // Выводим значение тега 'json' для найденного поля
    fmt.Println(getStructTag(field, "json")) // name_field
}

// Функция для получения значения тега по его имени
func getStructTag(f reflect.StructField, tagName string) string {
    return f.Tag.Get(tagName)
}

Этот код создаёт структуру User, затем с помощью рефлексии находит поле Name и извлекает значение тега json, которое в данном случае равно name_field. Убедитесь, что вы правильно используете reflect для работы с тегами структур. Если поле не найдено, будет выдано сообщение об ошибке.

Вы можете протестировать этот код на play.golang.org.

0

Вы можете использовать библиотеку github.com/fatih/structs, чтобы легко получить все теги из структуры. Вот пример, как это можно сделать:

package main

import (
    "fmt"

    "github.com/fatih/structs"
)

type User struct {
    Name string `json:"name_field"`
    Age  int    `json:"age_field"`
}

func main() {
    user := &User{}
    fields := structs.Fields(user)

    for _, field := range fields {
        tag := field.Tag("json")
        fmt.Println(tag)
    }
}

В этом коде мы создаем структуру User, которая имеет теги JSON для полей Name и Age. Затем, используя функцию structs.Fields, мы получаем информацию о полях структуры и извлекаем теги с помощью метода Tag. На выходе программа выведет следующие строки:

name_field
age_field

Этот подход является чистым и удобным способом для работы с тегами структур в Go, используя внешнюю библиотеку.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь