条件导入 Golang

4

我对Go语言还很陌生,我想知道如何在只有存在该包的情况下导入它。是否有方法可以做到这一点?我尝试使用“_”在包名前面,但是如果该包不存在,程序就无法编译。我知道我可能走错了路,但是如果我只想在该包存在时导入它,还有其他方法吗?


我找到了一个方法,将所有这些资源保存在数据库中,而不是导入它们。 - rocoder
1
这听起来不像是一个惯用的Go应用程序... Go支持插件,您可以在运行时导入,但我不确定这是否是您所需要的。 - Pavel Nikolov
1
这个问题可能有一个很好的原因:想象一下,你有一个 CLI,它有一个参数,将决定你是否使用 CGo 包装器来调用系统库(在某些架构/操作系统上可能不存在),并回退到纯 Go 库(可能更慢/受限). - Gwyneth Llewelyn
1个回答

6
这在Go语言中是不可能的。作为一种静态编译语言,只有当所有依赖项都存在时,才能编译二进制文件。 你能否详细说明首先为什么需要这样做?也许有更简单或更符合习惯的方法来实现您的想法。

我正在尝试构建一个“迷你CMS”,其中我想包括基本模型,如用户、日志和与它们相关的处理程序等。在将此“CMS”导入另一个应用程序时,我希望能够添加这些模型和处理程序。因此,我尝试从应用程序中导入一些包到“迷你CMS”中,但仅当应用程序存在时才导入。我已经非常怀疑这种方法是否可行,但我正在努力弄清楚这应该如何工作。 - rocoder
1
我给你的建议是 - 用抽象(接口)设计你的Go包(库)。因此,设计你的函数和方法来接受简单的接口(最好只有一个或两个方法),并返回接口或结构体。这样,当应用程序导入你的包时,它将能够使用接口的自定义实现(例如用于日志记录、跟踪或度量等)。该库需要是应用程序无关的,因此,例如,如果你构造了一个期望Logger接口的对象,而应用程序没有提供,则使用NoOp logger。 - Pavel Nikolov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接