Преобразовать структуру в * interface {} - PullRequest
0 голосов
/ 18 февраля 2020

Я использую checkr/goflagr, специально пытаясь создать EvalContext и заполнить поле EntityContext (для краткости некоторое содержимое ниже удалено)

type EvalContext struct {

    EntityContext *interface{} `json:"entityContext,omitempty"`
    // flagID
    FlagID int64 `json:"flagID,omitempty"`

}

Это код генерируется SwaggerGen, и я не уверен, как я могу отправить структуру в эту функцию без какого-либо ужасного обходного пути.

Моя интуиция сказала, что я должен иметь возможность просто передать адрес экземпляра структура, например

    type entityContext struct {
        Environment string `json:"environment"`
    }

    entityContextImpl := entityContext{Environment:"prod"}

    eval_ctx := goflagr.EvalContext{
        FlagID: int64(19),
        EntityContext: &entityContextImpl,
    }

Но это не так с

cannot use &entityContextImpl (type *entityContext) as type *interface {} in field value:
    *interface {} is pointer to interface, not interface

Я получил его для работы со следующим обходным решением:


func convertToStarInterface(i interface{}) *interface{} {
    return &i
}

func myFunc() {
    type entityContext struct {
        Environment string `json:"environment"`
    }

    entityContextImpl := entityContext{Environment:"prod"}

    ec := goflagr.EvalContext{
        FlagID: int64(18),
        EntityContext: convertToStarInterface(entityContextImpl),
    }
}

Но он чувствует как будто должен быть способ использовать эту функцию конвертера

1 Ответ

2 голосов
/ 18 февраля 2020

*interface{} настолько уродлив, насколько это возможно. Вполне возможно реализовать omitempty с интерфейсом {}, потому что interface{} может быть нулем. Вы должны рассмотреть вопрос об ошибке для этого. В любом случае ...

Если вам нужно передать *interface{}, вы можете сделать это:

var i interface{}
i=someStruct{}
ctx.EntityContext=&i

Ваша функция работает также, однако она не обязательно эффективна или проще для глаз.

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