为了账号安全,请及时绑定邮箱和手机立即绑定

使用错误变量作为包级与全局变量

使用错误变量作为包级与全局变量

Go
守候你守候我 2022-09-19 17:32:03
使用Go语言,我正在编写一个使用自定义错误变量的函数,例如func readEnv() (map[string]string, error) {    var ErrConfig = errors.New("Configuration Error: Variables starting with the right prefix are not even")if this {  return nil, ErrConfig}我将其声明为本地 var,以避免将其声明为不建议的包级 var(如果我没有记错,请从 linter 中标记为问题)当我想对这个fxn进行单元测试并且还想测试错误路径时,问题就出现了(在这种情况下,fxn应该返回上述错误,但是无法访问该错误)。现在,我能想到解决这个问题的唯一方法是在我的表测试中重新声明这个变量。哪种方法是正确的?声明为包级变量还是只是在单元测试 fxn 中重新声明它?ErrConfig
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

您返回的错误对调用方是否重要?readEnv()

如果没关系,你的测试也不应该在乎,只要检查返回的错误是否。nil

如果这很重要,在你当前的解决方案中,调用方在测试中的表现不能比你好。如果它很重要并且客户端应该能够分辨,则必须导出某种机制来测试/检查返回的错误。

一种解决方案是移动到包级别变量。这是可以接受的,在标准库中也使用了很多地方,例如io。断续器,约。错误关闭的管道ErrConfig

不过,这并不是唯一的解决方案。您可以进行未导出(例如),并提供导出的函数来测试错误,例如:ErrconfigerrConfig

var errConfig = errors.New("Configuration Error: Variables starting...")


func IsErrConfig(err error ) bool {

    return err == errConfig

}

这也用于标准库的许多地方,例如os。IsExist(), os.不存在()

您还可以使返回的错误实现导出的接口,并且调用方可以使用类型断言来检查返回的错误是否实现了该操作,从而为返回的错误提供了额外的功能。


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号