英文:
How to check for the existence of key in a nested struct
问题
我有以下的结构体:
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 之前检查每个属性(Data、Images、Fixed_height)的存在,以确保我没有空指针异常。由于我对该语言还比较新,我想知道如何以惯用方式实现这一点。
以下是我使用该结构体的方式:
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)
请注意,这只是翻译的部分,不包括回答你的问题。
英文:
I have the following struct
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"`
}
and I need to access Data[x].Images.Fixed_height.Url
. Ideally I'd like to be able to check for the existence of each of the Properties 'Data, Images, ,Fixed_height' before accessing Url to ensure I don't have a nil pointer exceptions. Since I'm fairly new to the language I was curious what the idiomatic way of doing this would be.
The following is how i'm using the struct.
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)
答案1
得分: 3
根据该结构的定义,唯一需要检查的是 len(Data) > x
。除此之外,所有的值类型都没有发生空引用恐慌的风险。
if len(Data) > x {
// 访问
fmt.Println(Data[x].Images.Fixed_height.Url)
} else {
// 处理其他意外输入的操作
}
英文:
The only required check (based on the definition of that struct) is that len(Data) > x
. Beyond that, everything is a value type so there is no risk of a nil reference panic happening.
if len(Data) > x {
// access
fmt.Println(Data[x].Images.Fixed_height.Url)
} else {
// do other stuff you to mitigate unexpected input
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论