我用err113作为golangci-lint的一部分.

它在抱怨……

foo_test.go:55:61: err113: do not define dynamic errors, use wrapped static errors instead: "errors.New(\"repo gave err\")" (goerr113)
        repoMock.EXPECT().Save(gomock.Eq(&foooBarBar)).Return(nil, errors.New("repo gave err")),
                                                                  ^

foo_test.go:22:42: err113: do not define dynamic errors, use wrapped static errors instead: "errors.New(\"oops\")" (goerr113)
    repoMock.EXPECT().FindAll().Return(nil, errors.New("oops"))
                                            ^

解决这个问题的最好方法是什么?

报价https://github.com/Djarvur/go-err113

此外,还会报告对errors.New()和fmt.Errorf()方法的任何调用 除了用于初始化包级变量的调用和 fmt.Errorf()调用包装其他错误.

我试图为这一点提供一个惯用的例子.

推荐答案

按照建议声明程序包级变量:

 var repoGaveErr = errors.New("repo gave err")

 func someFunc() {
    repoMock.EXPECT().Save(gomock.Eq(&foooBarBar)).Return(nil, repoGaveErr)
 }

每一次呼叫都会出错.New分配一个新的唯一错误值.应用程序通过声明包级别变量创建一个表示错误的值.

单一价值观有两个动机:

  • 应用程序可以比较值是否相等,以判断特定的错误情况.

  • 减少内存分配(尽管在实践中可能不是什么大事)

io.EOF是一个典型的例子.

Go相关问答推荐

理解Golang并发:缓冲通道的意外行为

困扰围棋官方巡回赛的S建议所有方法都使用同一类型的接收器

../golang/pkg/mod/github.com/wmentor/lemmas@v0.0.6/processor.go:72:9:未定义:令牌.进程

如何防止程序B存档/删除围棋中程序A当前打开的文件?

Go源在Goland(IDEA)中以灰色显示.什么意思?我怎么才能让它恢复正常?

Makefilego version和read命令

用接口来模拟amqp091go的困难

使用Dockertest进行Golang SQL单元测试的基本设置

如何使用 go-git 将特定分支推送到远程

在密钥不存在时处理 PATCH 部分更新

泛型:实现嵌套接口

Golang 中具体类型的错误片段

没有任务角色的 AWS CDK ECS 任务定义

当函数返回一个函数时,为什么 Go 泛型会失败?

如何在自定义验证函数中获取 struct 名称

Golang - 客户 Unmarshaler/Marshaler 在指针上具有 nil/null 值

为什么 go.mod 中的所有依赖都是间接的?

Go:如何创建一个可以提供配置文件中描述的 url 的服务器

Golang 将类型 [N]byte 转换为 []byte

Closed channel与nil channel