从源码中查找错误原因,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

解决方案:

最后更新于