避免在循环中强制转换切片值

时间:2018-08-13 15:12:47

标签: go

我正在从服务器读取API(JSON)响应,并且应该获取(如果状态为200 ok)以下响应。

// If I sent a wrong data ..
{ 
  error: "some value",
  message: "... description of the error"
}

// if all is good 
{
  events: [{key1: 1}, {key2: "two"} ... ]
}

因为我不确定响应的类型。 我将响应解码为map[string]interface{}

resp := make(map[string]interface{}, 0)
json.NewDecoder(response.Body).Decode(&resp)

稍后在代码流中,我到达了一个阶段,在这个阶段,我知道响应是一个很好的响应。我需要将interface{}转换回[]map[string]interface{}

但是我认为这不起作用..

// This does not work I guess. 
// events := resp["events"].([]map[string]interface{})

我设法做到这一点的唯一理智的方法是使用。

interFace := resp["events"].([]interface{})
for mapInterface := range interFace {
  row := MapInterface.(map[string]interface{})
  // now use the row hence forth
} 

这可以通过任何其他方式或任何其他方法 1 来完成,这些方法可以避免在循环内部进行强制转换。

1:也许在这里创建Response结构是可行的。但我真的很想听听其他可以尝试使用struct方法的其他方法。

1 个答案:

答案 0 :(得分:1)

您可以定义一个在结构中同时具有错误值和非错误值的结构。

type Response struct {
    ErrorMessage string `json:"message"`
    Error string `json:"error"`
    Events []map[string]interface{} `json:"events"`
}