我想在包Error Codes
中定义我的models
。
error.go
package models
const{
EOK = iota
EFAILED
}
如何在另一个包中使用它们而不将它们称为models.EOK
。我想直接使用EOK,因为这些代码在所有包中都是通用的。
这是正确的方法吗?还有更好的选择吗?
答案 0 :(得分:8)
您可以使用dot
导入语法将其他包中的导出符号直接导入包的命名空间(godoc):
import . "models"
通过这种方式,您可以直接引用EOK
常量,而不用models
作为前缀。
但是我强烈反对这样做,因为它会产生相当难以理解的代码。见下文
答案 1 :(得分:1)
W.r.t。最初的问题,使用紧凑的包名称,例如错误。
选择传播错误和生成错误消息的方法取决于应用程序的规模和复杂性。您显示的错误样式,使用int,然后使用函数对其进行解码,就是C-ish。
这种风格部分原因是:
对于包含简单错误字符串的小型应用。我将包的错误字符串放在包文件的头部,然后返回它们,可能使用errors.New(...)或fmt.Errorf如果需要使用某些数据完成字符串。
错误报告的'int'风格不提供像Go的错误界面那样灵活的东西。错误接口允许我们构建信息丰富的错误结构,返回有用的信息,而不仅仅是int值或字符串。
暗示不同的包可以产生实现Error接口的不同的实类。我们不需要在整个软件包集中同意单个错误实型。因此,错误是一个易于传播的接口,就像一个int,然而,真实类型的错误可能比int更丰富。错误生成(实现错误)可以像我们需要的那样集中或分布,不像strerror()样式的函数可能难以扩展。