我正在从服务器读取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:也许可以在这里创建Response结构。但是我真的很想听听其他可以通过struct方法进行尝试的方法。

最佳答案

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

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

关于go - 避免在循环中强制转换 slice 值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51825482/

10-13 09:16