有效的Go-以及许多其他Wiki和站点-劝诫Go程序员对软件包使用简单的名称,并避免使用诸如'misc'或'utils'之类的通用名称。
此外,避开多级名称空间-它具有一级-程序包名称。
因此,包名称很简单,最多只能组合一个或两个单词,并且特定于主题...
然后就无法将新代码注入到现有的程序包中-因此,例如,'os'中的内容基本上由我偶然选择使用的任何版本的包'os'的作者来密封(很可能是Golang os包)。
但是这是我挠头的地方...
[我该如何写-我自己的一个好的库-将现有的概念/包-例如os或fmt或诸如“扩展映射类型”之类的通用名-扩展到一个包或一组包中,以在我自己的项目之间共享(或我的组织,或者可能是及时公开)?
作为一个任意示例,假设我通常需要一个诸如GetEnvOrDefault(key, def string) string
的函数
[这很有用-可以作为if语句集长期使用-但具有自我说明性,并且一次编写时要短一些,并且允许客户端代码使用并且含义也更短,更简洁(较少视觉解析“ GetEnvOrDefault”与一遍又一遍的拼写代码-在这种情况下:
// GetEnvOrDefault returns the specified environment variable's contents, or the specified default value if that env var is not present
func GetEnvOrDefault(key, defvalue string) string {
value := os.Getenv(key)
if len(value) == 0 {
value = defvalue
}
return value
}
这只是一个示例-简短,以适合此处并易于讨论。我将大胆尝试一下,并假设您可以想到一个任意的更复杂的示例,其中毫无疑问,您希望将其放入库中以便编写和调试一次,然后使用多个项目并使用此类功能。
所以...这个包裹叫什么名字?
不是'utils'或'misc',因为在Go中太糟糕了。不能是“ os”,因为它已经有效地密封了。不能是“组织/操作系统”,因为我们不能做多级名称空间。不应该是'organization_os',因为对于Go而言这不是惯用的。
那那把我们留在哪里?
'osx'-嗯...'osex'-很有趣但是...'osmisc'-看起来很丑/很糟糕...'env'-好的,当然,但是那是超级通用的-我想打赌多少,已经有一些软件包更值得这个名称了,将来会发生冲突...
你觉得我吗?
这是一个例子。但是我对JSON,uuid,映射,32bit数学,http服务器,http客户端等都有有用的扩展。...
程序员做什么?
复制这么小的杂项。每个项目的实用工具功能和类型?
要使用非常非惯用的软件包名称吗?
您有什么建议?
标准库使用“ util”后缀。示例:
有几种解决方法。
首先,即使不鼓励使用,misc
,helpers
,api
程序包也存在于许多项目中。
如果将扩展名写入现有程序包something
,则可以命名新程序包somethingext
。
您可以依靠用户正确使用别名来使用多级命名:
import (
"os"
osutils "github.com/someproject/os"
)
[如果要编写现有软件包something
的替代品,则可以命名软件包something
,类似于github.com/sirupsen/logrus
,它是stdlib log
软件包的替代品。
[在非常简单的情况下,我不介意在我的项目中使用utils
软件包。如果函数调用是显式的,例如utils.GetEnvOrDefault
,我发现它仍然很容易阅读和理解。
但是让我们考虑一个更复杂的情况。您提到在包中使用公司名称,例如organization_os
。这确实使代码更难阅读。
包名也可以是自记录的。可以选择enviroment.GetEnvOrDefault
。如果名称太大,则始终可以将导入别名化为更简洁的名称。