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

时间:2015-12-12 18:44:34

标签: go

我想在包Error Codes中定义我的models

error.go

package models

const{
  EOK = iota
  EFAILED
}

如何在另一个包中使用它们而不将它们称为models.EOK。我想直接使用EOK,因为这些代码在所有包中都是通用的。

这是正确的方法吗?还有更好的选择吗?

2 个答案:

答案 0 :(得分:8)

回答你的核心问题

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

import . "models"

通过这种方式,您可以直接引用EOK常量,而不用models作为前缀。

但是我强烈反对这样做,因为它会产生相当难以理解的代码。见下文

一般/风格建议

  1. 不要使用像models这样的无前缀导出路径。这被认为是糟糕的风格,因为它很容易被打造。即使对于仅在内部使用的小型项目,也要使用类似myname/models的内容。见goblog
  2. 关于错误生成的问题,有一些用于生成error值的函数,例如errors.Newgodoc)和fmt.Errorfgodoc)。 有关go和错误处理的一般性介绍,请参阅goblog

答案 1 :(得分:1)

W.r.t。最初的问题,使用紧凑的包名称,例如错误。

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

这种风格部分原因是:

  • 缺少多个值返回(与Go不同),
  • 需要使用简单类型(易于传播)和
  • 通过函数转换为文本(与Go的错误界面不同),以便可以更改本地语言字符串。

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

错误报告的'int'风格不提供像Go的错误界面那样灵活的东西。错误接口允许我们构建信息丰富的错误结构,返回有用的信息,而不仅仅是int值或字符串。

暗示不同的包可以产生实现Error接口的不同的实类。我们不需要在整个软件包集中同意单个错误实型。因此,错误是一个易于传播的接口,就像一个int,然而,真实类型的错误可能比int更丰富。错误生成(实现错误)可以像我们需要的那样集中或分布,不像strerror()样式的函数可能难以扩展。