Как я могу изменить префикс для всех тегов структуры не вручную? - PullRequest
0 голосов
/ 16 января 2019

Предположим, у меня есть следующее:

type My struct{
  First string `xml:"first"`
  Last string `xml:"name"`
  ...many more tags...
}

Я бы хотел изменить префикс всех тегов на «mycustomtag». Я видел https://stackoverflow.com/a/42549826/522962, но это описывает ручной способ, когда вы определили вторую структуру с тегами вручную. Как мне сделать это автоматически?

например. Я хотел бы закончить что-то вроде ниже, но так как есть много, много полей, как мне это сделать, чтобы мне не пришлось делать это вручную?:

// how do I do the next part automagically????
func (m *My) MarshalJSON() ([]byte, error) {
    type alias struct {
        First string `mycustomtag:"first"`
        Last string `mycustomtag:"name"`
        ...many more tags...
    }
    var a alias = alias(*m)
    return json.Marshal(&a)
}

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы также можете сделать это во время выполнения с отражением , если вам нужно.

func (m *My) MarshalJSON() ([]byte, error) {
    oldtype := reflect.TypeOf(*m)
    fields := make([]reflect.StructField, oldtype.NumField())
    for i := 0; i < oldtype.NumField(); i++ {
        field := oldtype.Field(i)
        if _, ok := field.Tag.Lookup("xml"); ok {
            field.Tag = reflect.StructTag(strings.Replace(string(field.Tag), "xml", "json", 1))
        }

        fields[i] = field
    }
    newtype := reflect.StructOf(fields)
    a := reflect.ValueOf(*m).Convert(newtype).Interface()
    return json.Marshal(&a)
}

Рабочий пример

0 голосов
/ 16 января 2019

Если это не во время выполнения, а для статического изменения исходного кода, вы можете использовать fatih/gomodifytags.

См. " Написание инструмента Go для анализа и измененияТеги Struct"

Теги полей структуры являются важной частью типов кодирования / декодирования, особенно при использовании таких пакетов, как encoding / json.
Однако изменение тегов является повторяющимся, громоздким иоткрыты для человеческих ошибок.
Мы можем упростить изменение тегов с помощью автоматизированного инструмента, написанного исключительно для этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...