我有以下结构
type GiphyJson struct {
Type string `json:"type"`
Data []struct {
Images struct {
Fixed_height struct {
Url string `json:"url"`
} `json:"fixed_height"`
} `json:"images"`
} `json:"data"`
}
我需要访问Data[x].Images.Fixed_height.Url
。理想情况下,我希望能够检查每个属性'数据,图像,固定高度'是否存在。在访问Url之前,确保我没有nil指针异常。由于我对这种语言比较陌生,我很好奇这样做的惯用方法是什么。
以下是我如何使用结构。
var err error
var giphyJson GiphyJson
keyword = url.QueryEscape(keyword)
resp, err := http.Get("http://api.giphy.com/v1/gifs/search?q=" + keyword + "&api_key=dc6zaTOxFJmzC&limit=100")
if err != nil {
err = errors.New("An error occured trying to contact giphy")
return "", err
}
defer resp.Body.Close()
bodyBytes, err := ioutil.ReadAll(resp.Body)
err = json.Unmarshal(bodyBytes, &giphyJson)
答案 0 :(得分:2)
唯一需要的检查(基于该结构的定义)是len(Data) > x
。除此之外,一切都是一种价值类型,因此没有发生零参考恐慌的风险。
if len(Data) > x {
// access
fmt.Println(Data[x].Images.Fixed_height.Url)
} else {
// do other stuff you to mitigate unexpected input
}