Инициализация внешней структуры lib с собственной структурой (декодированной JSON) дает ошибку типа - PullRequest
0 голосов
/ 31 января 2019

У меня есть структура, которая декодируется из требования JSON http POST.Моя цель иметь эту структуру: - Упростить JSON-запрос от клиента. - Использовать данные свойств Structs в другой (внешней библиотеке) структуре.

Если мне нужно было использовать только внешнюю библиотечную структуру, установка JSON клиента будетвыглядеть сбивающим с толку.Как использовать значения структур в другой структуре (и особенно в их массивах)?

У меня есть рабочее решение для некоторых значений простых типов.

Рассмотрим следующее: Ext lib struct:

type ExtStruct struct {
    From             *Email             
    Subject          string             
    Personalizations []*Personalization
 }

Моя структура lib:

type MyStruct struct {
         From            *Email             
         Subject          string             
         Personalizations []*Personalization
     }

Вот мой код:

myStruct := &MyStruct{}
err := json.NewDecoder(body).Decode(myStruct)
extStruct := &ExtStruct{
    Subject: myStruct.Subject,
    From:    (*extStruct.Email)(myStruct.From),
    Personalizations: []*extStruct.Personalization{
        To: ([]*extStruct.Email)(myStruct.To),
    }}

Значение Subject и From работает,но я получаю ошибки при попытке ссылки на значения массива.Я не вижу, где я не прав.AFAIK нет другой возможности «упростить» ввод JSON от клиента, только для ссылки на значения в другой большей структуре.Я могу при необходимости включить другие ссылочные структуры, но думаю, что это:

type A struct {
    RefB []*B
}

type B struct {
    RefC []*C
    Value string
}
type C struct {
    Value string
}

И мне нужно, чтобы моя структура ссылалась на C.

Ответы [ 2 ]

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

Хорошо, так что я узнал, что невозможно нарезать ломтики.Если вы ссылаетесь на мой пост:

extStruct := &ExtStruct{
    Subject: myStruct.Subject,
    From:    (*extStruct.Email)(myStruct.From),
    Personalizations: []*extStruct.Personalization{
        To: ([]*extStruct.Email)(myStruct.To),
    }}

Срез Personalizations стал:

Personalizations: ([]*extStruct.Personalization{{
    To: castStruct(myStruct.To),
}}),

И

func castStruct(input []*myStruct.Email) []*extStruct.Email {
    output := make([]*extStruct.Email, len(input))
    for index, content := range input {
        output[index] = (*extStruct.Email)(content)
    }
    return output
}

Я не знаю, есть либолее умный способ сделать это, но это, как мне удалось в конце концов.Просто прокомментируйте это, если хотите подробностей, и я постараюсь предоставить.

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

Может быть, я неправильно понял, но я бы подумал, что инициализация ExtStruct будет выглядеть больше как

extStruct := &ExtStruct{
    From:             myStruct.From,
    Personalizations: myStruct.Personalizations,
}

https://play.golang.org/p/lqFFBa7SKGg

Если они несовместимы, Email и Personalization,Вы должны выполнить маршалинг непосредственно в ExtStruct или выполнить маршаллинг между типами самостоятельно.

Я думаю, что вам следует уточнить свой ответ, возможно, приведите рабочий (но ошибочный) пример.

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