2014-02-15 75 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