golang如何访问接口字段

Posted

技术标签:

【中文标题】golang如何访问接口字段【英文标题】:golang how to access interface fields 【发布时间】:2014-03-14 19:19:38 【问题描述】:

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

【问题讨论】:

你为什么返回interface而不是*results 【参考方案1】:

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

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

dynamic_value := interface_variable.(typename)

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

    在顶层定义 results 类型,而不是在方法体中。

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

【讨论】:

我真的不明白如何在顶层定义结果类(类型),因为它有一个 Hits 类型的 hits。我错过了什么吗? SearchItemsByUser 似乎没有返回空接口。如果我从测试函数( 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) 你已经定义了返回interface的函数——那是空接口。***,我的意思是在包级别,而不是嵌入在方法中。 hits 类型和它有什么关系? @mihai 当然searchItemsByUser返回一个空接口!你是这么宣布的!该值仍然存在,但它在界面“后面”。您仍然可以提取值(或将其转换到另一个接口),这就是 fmt.Fprintf 所做的。 好的...它可以工作而且很棒!我不知道我可以在包级别定义它。

以上是关于golang如何访问接口字段的主要内容,如果未能解决你的问题,请参考以下文章

Golang学习+深入-面向“对象“编程

使用golang反向代理统计api访问次数

Println如何访问golang中未导出的字段?

Typescript 接口 - 字段类型:MyInterface |字符串,尝试访问属性时不起作用

Go Lang 帮助 - 访问接口的数组/切片

Java 虚拟机原理Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )