问题描述
背景
我正在尝试分析来自 Reddit api 的用户数据。我已声明用户 type User struct {
Kind string `json:"kind"`
Data struct {
...
Subreddit struct {
...
} `json:"subreddit"`
...
CreatedUtc float64 `json:"created_utc"` <---
...
} `json:"data"`
}
如下:
func GetUser(url string) User {
var response User
resp,err := http.Get(url)
if err != nil {
...
}
defer resp.Body.Close()
body,err := IoUtil.ReadAll(resp.Body)
if err != nil {
...
}
err = json.Unmarshal(body,&response)
if err != nil {
...
}
fmt.Print(response.Data.CreatedUtc) <---
return response
}
我从 api 请求数据并在此处打印。
created_utc
问题
当我请求此 endpoint 时,它打印 0,而我可以在浏览器中看到 {{1}} 时间戳为 1562538742。这似乎发生在绝大多数(但不是全部)情况下。>
我的类型转换有问题吗?
解决方法
要理解为什么它为零,您必须首先了解在 Go 中,类型不会像其他语言那样自动引用。默认情况下,变量 var abc int
的值为 0
。
在测试 JSON 是否正确解析时,您可以将类型的值更改为指针。这样,任何未填充的字段都是 nil
而不是该类型的默认值。
这样做,您可以查看返回的值是否为真,或者是否存在其他故障,例如错误的数据模型或失败的网络调用。
,感谢@JimB 指出我没有检查响应的状态代码。我原以为它会在大于 400 时抛出错误,但根据 docs 情况并非如此。
就我而言,修改请求以包含用户代理标头解决了该问题。