2017-09-27 122 views
0

我想從Golang中的接口獲取字段值。該接口最初是一個空的接口,它從數據庫結果中獲取其值。數據庫查詢工作正常。從接口獲取接口字段值而無需在Golang聲明結構

我唯一需要的是我需要獲取接口的字段值。 這裏是我的代碼:

s := reflect.ValueOf(t) 
    for i := 0; i < s.Len(); i++ { 
     fmt.Println(s.Index(i)) 
    } 

其中T是一個接口有以下值:

map[id:null count:1] 

我想要的"count"值等簡單記1

我的問題是,該指數()方法返回一個恐慌,因爲它需要一個結構,我沒有任何結構在這裏。那麼我應該怎麼做才能獲得界面價值?是否有任何解決方案來迭代接口以獲取帶有或不帶有Golang反射包的字段值?

編輯

獲得價值數後,我需要把它解析爲JSON。

這裏是我的代碼:

type ResponseControllerList struct{ 
    Code   int    `json:"code"` 
    ApiStatus  int    `json:"api_status"` 
    Message   string   `json:"message"` 
    Data   interface{}  `json:"data,omitempty"` 
    TotalRecord  interface{}  `json:"total_record,omitempty"` 
} 
response := ResponseControllerList{} 
ratingsCount := reflect.ValueOf(ratingsCountInterface).MapIndex(reflect.ValueOf("count")) 
fmt.Println(ratingsCount) 

response = ResponseControllerList{ 
       200, 
       1, 
       "success", 
       nil, 
       ratingsCount, 
      } 
GetResponseList(c, response) 

func GetResponseList(c *gin.Context, response ResponseControllerList) { 
    c.JSON(200, gin.H{ 
     "response": response, 
    }) 
} 

上面的代碼被用於獲取JSON格式的ratingCount使用此響應,API響應。在這段代碼中,我使用GIN框架向API發出HTTP請求。

現在的問題是,當我打印變量ratingsCount時,它在終端顯示我需要的計數的確切值。但是,當我將它傳遞給JSON,同一個變量給我喜歡的響應:

{ 
    "response": { 
     "code": 200, 
     "api_status": 1, 
     "message": "Success", 
     "total_record": { 
      "flag": 148 
     } 
    } 
} 

什麼,就是以JSON伯爵的實際價值的方式?

+0

「因爲它需要一個結構Index()方法返回一個恐慌」。索引適用於切片和數組。你能否更深入地解釋問題是什麼?例如。你的't'接口看起來像JSON,不像Go接口類型? – Volker

+0

其實我是解析接口到json。現在我編輯了界面。 Index()因爲獲取地圖而驚慌失措。地圖未定義爲與索引一起使用。對 ?我只想從界面中獲得「計數」字段值。 –

+0

https://golang.org/pkg/reflect/#Value.MapIndex – Volker

回答

1

您可以使用類型斷言而不是反射。只要有可能,避免反射通常會更好。

m, ok := t.(map[string]interface{}) 
if !ok { 
    return fmt.Errorf("want type map[string]interface{}; got %T", t) 
} 
for k, v := range m { 
    fmt.Println(k, "=>", v) 
} 

如果你真的想使用反射,你可以做這樣的事情:

s := reflect.ValueOf(t) 
for _, k := range s.MapKeys() { 
    fmt.Println(s.MapIndex(k)) 
} 

更新回覆您的最新更新

不退還您所期望的原因是什麼它返回一個reflect.Value。如果你想要一個整數值,你必須使用ratingsCount.Int()

但正如我之前所說的,不要使用反射。使用類型斷言的第一個解決方案,並獲得與m["count"]的計數。

我張貼的工作比如有使用類型斷言:不對https://play.golang.org/p/9gzwtJIfd7

+0

感謝您回覆我的問題。我已經檢查了你的解決方案和它的工作正常,以獲得計數值。但我已經編輯我的帖子來獲得這個計數值在json中。如果您有任何問題,請檢查並提供解決方案。 –

+0

Well @ R3v4n,既不是類型斷言也不是'ratingsCount.Int()'正在工作。當我輸入斷言時,它會返回一個空映射。另外'ratingsCount.Int()'給出了恐慌:'reflect:調用接口Value上的reflect.Value.Int。 –

+0

@Amandeepkaur:我編輯了我的回覆,並附上Go遊樂場上的實例。忘掉這個反射,它確實讓事情變得更加複雜,沒有收穫。讓我們專注於使用類型斷言的解決方案。如果地圖爲空,則可能是「ratingsCountInterface」的值不符合您的預期。你能粘貼整個源代碼嗎? – R3v4n