Interface golang如何访问接口字段

Interface golang如何访问接口字段,interface,go,Interface,Go,我有一个函数,如下所示,它解码一些json数据并将其作为接口返回 package search func SearchItemsByUser(r *http.Request) interface{} { type results struct { Hits hits NbHits int NbPages int HitsPerPage int

我有一个函数,如下所示,它解码一些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)

接口变量可用于存储符合接口的任何值,并调用属于该接口一部分的方法。请注意,您将无法通过接口变量访问基础值上的字段

在这种情况下,您的
SearchItemsByUser
方法返回一个
接口{}
值(即空接口),该接口可以保存任何值,但不提供对该值的任何直接访问。您可以通过类型断言提取接口变量持有的动态值,如下所示:

dynamic_value := interface_variable.(typename)
除此之外,在本例中,动态值的类型是SearchItemsByUser方法的私有类型。我建议对您的代码进行两项更改:

  • 在顶层定义
    结果
    类型,而不是在方法体中

  • 使
    SearchItemsByUser
    直接返回
    results
    类型的值,而不是
    interface{}


  • 我真的不知道如何在顶层定义results类(type),因为它有一个Hits类型。我错过什么了吗?SearchItemsByser似乎不返回空接口。如果我打印测试函数的结果(fmt.Fprintf(w,“%s”,result)),我会得到与我需要的数据非常相似的东西(例如test0%!s(int=3)mihai/test0/0}]!s(int=1)%!s(int=1)%!s(int=10)%!s(int=1)attributesToHighlight)您定义了返回
    接口{}
    ——这是空接口。我所说的顶层是指在包级别,而不是嵌入到方法中。
    hits
    类型与此有什么关系?@mihai当然
    searchItemsByUser
    返回一个空界面!你那样说的!该值仍然存在,但它位于接口的“后面”。您仍然可以提取值(或将其转换到另一个接口),这就是
    fmt.Fprintf
    所做的。好吧……它工作正常,非常棒!我不知道我可以在包级别定义它。为什么返回
    接口{}
    而不是
    *结果