2014-02-15 108 views
12

我有一个函数如下,其解码一些JSON数据,并将它作为一个接口golang如何访问界面领域

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

为什么你返回'interface {}'而不是'* results'? –

回答

14

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

在这种情况下,您的SearchItemsByUser方法将返回一个值为interface{}的值(即空接口),该值可以包含任何值,但不提供对该值的任何直接访问。你可以通过一个类型断言提取由接口变量保持的动态值,就像这样:

dynamic_value := interface_variable.(typename) 

只是在这种情况下,动态值的类型是专用于你的SearchItemsByUser方法。我建议做两个修改了代码:

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

  2. 品牌SearchItemsByUser直接返回results类型的值而不是interface{}

+0

我真的不知道如何在最高级别定义结果类(类型),因为它有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) – themihai

+0

您已定义函数以返回'interface {} ' - 这是空的界面。从顶层来说,我的意思是在包级别,而不是嵌入到方法中。 “命中”类型与它有什么关系? –

+0

@mihai当然'searchItemsByUser'返回一个空的界面!你是这样宣布的!该值仍然存在,但它是“_behind_”界面。您仍然可以提取该值(或将其转换为另一个接口),这是'fmt.Fprintf'所做的。 – Cubic