Golang как получить доступ к полям интерфейса

У меня есть функция, как показано ниже, которая декодирует некоторые json-данные и возвращает их как интерфейс

package search

func SearchItemsByUser(r *http.Request) interface{} {

    type results struct {
        Hits             hits
        NbHits           int
        NbPages          int
        HitsPerPage      int
        ProcessingTimeMS int
        Query            string
        Params           string
    }

    var Result results

    er := json.Unmarshal(body, &Result)
    if er != nil {
        fmt.Println("error:", er)
    }
    return Result

}

Я пытаюсь получить доступ к полям данных (например, Params), но по некоторым причинам он говорит, что у интерфейса нет такого поля. Любая идея почему?

func test(w http.ResponseWriter, r *http.Request) {

    result := search.SearchItemsByUser(r)
        fmt.Fprintf(w, "%s", result.Params)

Ответ 1

Переменная интерфейса может использоваться для хранения любого значения, соответствующего интерфейсу, и методов вызова, которые являются частью этого интерфейса. Обратите внимание, что вы не сможете получить доступ к полям базового значения через переменную интерфейса.

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

dynamic_value := interface_variable.(typename)

За исключением того, что в этом случае тип динамического значения является приватным для вашего метода SearchItemsByUser. Я бы предложил внести два изменения в ваш код:

  • Определите тип results на верхнем уровне, а не внутри тела метода.

  • Сделайте SearchItemsByUser прямое возвращение значения типа results вместо interface{}.