从源码中查找错误原因,3个例子
go-zero配置文件使用validate tag,读取失败
// etc/user-api.yaml
Session:
ExpirationInMinutes: 30
RefreshThresholdInMinutes: 5
package config
type Config struct {
Session struct {
ExpirationInMinutes int `validate:"gt=0"`
RefreshThresholdInMinutes int `validate:"ltefield=ExpirationInMinutes"`
}
}
package main
import (
...
)
var configFile = flag.String("f", "etc/user-api.yaml", "the config file")
func main() {
flag.Parse()
var c config.Config
conf.MustLoad(*configFile, &c)
...
}
MustLoad执行完没报错,但是发现读出来的字段的值是0,然后尝试在valildate tag前面加一个yaml tag,还是不行。
1) 点进MustLoad源码去看:
2) 再点进Load函数:

Load函数返回了一个loader函数,而loader函数又是来自一个叫loaders的map
3) 查看loaders

配置文件是用yaml写的,那就点LoadFromYamlBytes函数
4)查看LoadFromYamlBytes函数

原来是先把yaml转换成json,再进行解析。把yaml tag换成json tag果真解决了问题
gomock redis
// mock
func(ctrl *gomock.Controller) redis.Cmdable {
...
mockCmd.SetVal(0)
...
}
// 被测试的业务代码
res, err := c.cmd.Eval(ctx, luaSetCode, []string{c.Key(businessName, phoneNumber)}, authCode).Int()
报错:redis: unexpected type=int for Int,
res和err都是从 c.cmd.Eval().Int()里面返回的,点进去:

要么是int64要么是string,把mockCmd.SetVal(0)改成mockCmd.SetVal(int64(0))即可
http库创建请求时爆空指针
业务代码:

安装http规范,一个POST请求的body是可以为null的
点进去:

是在这一行爆空指针

说明是v是nil,调用Len()的时候爆空指针
业务代码里的body就是nil
解决方案:

最后更新于