对于最初的问题,请使用紧凑的包名称,例如 err。选择传播错误和生成错误消息的方法取决于应用程序的规模和复杂性。您显示的错误样式,使用一个 int,然后使用一个函数对其进行解码,非常 C-ish。这种风格的部分原因是:缺少多值返回(与 Go 不同),需要使用简单类型(易于传播),以及使用函数将其转换为文本(与 Go 的错误界面不同),以便可以更改本地语言字符串。对于带有简单错误字符串的小型应用程序。我将包的错误字符串放在包文件的开头,然后返回它们,如果需要使用某些数据完成字符串,可能使用 errors.New(...) 或 fmt.Errorf。这种“int”风格的错误报告并没有像 Go 的错误界面那样灵活。error 接口允许我们构建信息丰富的错误结构,以返回有用的信息,而不仅仅是一个 int 值或字符串。这意味着不同的包可以产生实现 Error 接口的不同实类型。我们不需要在整个包中就单一错误类型达成一致。所以 error 是一个可以很容易地传播的接口,就像一个 int,然而,错误的真实类型可以比 int 丰富得多。错误生成(实现错误)可以根据我们的需要集中或分布式,不像 strerror() 风格的函数难以扩展。