golang如何访问接口字段

问题描述 投票:0回答:1

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

}

我正在尝试访问数据字段(例如参数),但由于某些原因它说接口没有这样的字段。知道为什么吗?

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

    result := search.SearchItemsByUser(r)
        fmt.Fprintf(w, "%s", result.Params)
interface go
1个回答
33
投票

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

在这种情况下,您的

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

dynamic_value := interface_variable.(typename)

除了在这种情况下,动态值的类型对于您的 SearchItemsByUser 方法来说是私有的。我建议对您的代码进行两处更改:

  1. 在顶层定义您的

    results
    类型,而不是在方法体内。

  2. 使

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

© www.soinside.com 2019 - 2024. All rights reserved.