Я разрабатываю инструмент, который можно реализовать, чтобы упростить процесс создания простых операций / конечных точек CRUD. Поскольку мои конечные точки не знают, какую структуру они будут получать, я создал интерфейс, который пользователи могут реализовать, и возвращает пустой объект для заполнения.
type ItemFactory interface {
GenerateEmptyItem() interface{}
}
И пользователи будут реализовывать что-то вроде:
type Test struct {
TestString string `json:"testString"`
TestInt int `json:"testInt"`
TestBool bool `json:"testBool"`
}
func (t Test) GenerateEmptyItem() interface{} {
return Test{}
}
Когда объект Test создается, его типом является «Test», хотя func возвращает интерфейс {}. Однако, как только я пытаюсь разархивировать некоторые json того же формата в него, он удаляет его тип и становится типа "map [string] interface {}".
item := h.ItemFactory.GenerateEmptyItem()
//Prints "Test"
fmt.Printf("%T\n", item)
fmt.Println(reflect.TypeOf(item))
err := ConvertRequestBodyIntoObject(r, &item)
if err != nil {...}
//Prints "map[string]interface {}"
fmt.Printf("%T\n", item)
Функция, которая демаршализирует предмет:
func ConvertRequestBodyIntoObject(request *http.Request, object interface{}) error {
body, err := ioutil.ReadAll(request.Body)
if err != nil {
return err
}
// Unmarshal body into request object
err = json.Unmarshal(body, object)
if err != nil {
return err
}
return nil
}
Любые предложения относительно того, почему это происходит, или как я могу обойти это?
Спасибо