Go-如何惯用地构建对现有软件包的扩展?

问题描述 投票:1回答:3

有效的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客户端等都有有用的扩展。...

程序员做什么?

复制这么小的杂项。每个项目的实用工具功能和类型?

要使用非常非惯用的软件包名称吗?

您有什么建议?

go namespaces package shared-libraries idiomatic
3个回答
0
投票

标准库使用“ util”后缀。示例:


0
投票

有几种解决方法。

首先,即使不鼓励使用,mischelpersapi程序包也存在于许多项目中。

如果将扩展名写入现有程序包something,则可以命名新程序包somethingext

您可以依靠用户正确使用别名来使用多级命名:

import (
   "os"
   osutils "github.com/someproject/os"
)

[如果要编写现有软件包something的替代品,则可以命名软件包something,类似于github.com/sirupsen/logrus,它是stdlib log软件包的替代品。


0
投票

[在非常简单的情况下,我不介意在我的项目中使用utils软件包。如果函数调用是显式的,例如utils.GetEnvOrDefault,我发现它仍然很容易阅读和理解。

但是让我们考虑一个更复杂的情况。您提到在包中使用公司名称,例如organization_os。这确实使代码更难阅读。

包名也可以是自记录的。可以选择enviroment.GetEnvOrDefault。如果名称太大,则始终可以将导入别名化为更简洁的名称。

© www.soinside.com 2019 - 2024. All rights reserved.