我有一个函数如下所示,它解码一些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
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试访问数据字段(例如Params)但由于某些原因它说接口没有这样的字段.知道为什么吗?
func test(w http.ResponseWriter, r *http.Request) {
result := search.SearchItemsByUser(r)
fmt.Fprintf(w, "%s", result.Params)
Run Code Online (Sandbox Code Playgroud)
Jam*_*dge 21
接口变量可用于存储符合接口的任何值,并调用该接口的艺术部分.请注意,您将无法通过接口变量访问基础值的字段.
在这种情况下,您的SearchItemsByUser
方法返回一个interface{}
值(即空接口),该值可以包含任何值,但不提供对该值的任何直接访问.您可以通过类型断言提取接口变量所拥有的动态值,如下所示:
dynamic_value := interface_variable.(typename)
Run Code Online (Sandbox Code Playgroud)
除了在这种情况下,动态值的类型对于SearchItemsByUser方法是私有的.我建议对代码进行两处更改:
results
在顶级定义您的类型,而不是在方法主体中定义.
请SearchItemsByUser
直接返回值results
类型代替interface{}
.