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

创建跨包可见的常量,可直接访问

创建跨包可见的常量,可直接访问

Go
缥缈止盈 2021-11-29 16:01:22
我想Error Codes在一个包中定义我的models。错误.gopackage modelsconst{  EOK = iota  EFAILED}我如何在另一个包中使用它们而不将它们称为models.EOK. 我想直接用作 EOK,因为这些代码在所有包中都是通用的。这是正确的方法吗?有没有更好的选择?
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

回答你的核心问题

您可以使用dot导入语法将另一个包中导出的符号直接导入包的命名空间 ( godoc ):

import . "models"

这样你就可以直接引用EOK常量而不用前缀models.

但是我强烈建议不要这样做,因为它会生成相当不可读的代码。见下文

一般/风格建议

  1. 不要使用像models. 这被认为是不好的风格,因为它很容易 globber。即使对于仅在内部使用的小型项目,也可以使用类似myname/models. 见goblog

  2. 关于您关于错误生成的问题,有用于生成error值的函数,例如errors.Newgodoc ) 和fmt.Errorfgodoc )。有关 go 和错误处理的一般介绍,请参阅goblog


查看完整回答
反对 回复 2021-11-29
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

对于最初的问题,请使用紧凑的包名称,例如 err。

选择传播错误和生成错误消息的方法取决于应用程序的规模和复杂性。您显示的错误样式,使用一个 int,然后使用一个函数对其进行解码,非常 C-ish。

这种风格的部分原因是:

  • 缺少多值返回(与 Go 不同),

  • 需要使用简单类型(易于传播),以及

  • 使用函数将其转换为文本(与 Go 的错误界面不同),以便可以更改本地语言字符串。

对于带有简单错误字符串的小型应用程序。我将包的错误字符串放在包文件的开头,然后返回它们,如果需要使用某些数据完成字符串,可能使用 errors.New(...) 或 fmt.Errorf。

这种“int”风格的错误报告并没有像 Go 的错误界面那样灵活。error 接口允许我们构建信息丰富的错误结构,以返回有用的信息,而不仅仅是一个 int 值或字符串。

这意味着不同的包可以产生实现 Error 接口的不同实类型。我们不需要在整个包中就单一错误类型达成一致。所以 error 是一个可以很容易地传播的接口,就像一个 int,然而,错误的真实类型可以比 int 丰富得多。错误生成(实现错误)可以根据我们的需要集中或分布式,不像 strerror() 风格的函数难以扩展。


查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信