← Back to blog

如何在 Go 中导入包

Category
如何在 Go 中导入包

Go (也称为 Golang) 是一种开源的静态类型编程语言。它最初由 Google 开发。Go 的一些显著特点包括简单、高性能、可读性和高效。

与其他优秀的编程语言一样,Go 的标准库提供了丰富的包。然而,我们也可以通过引入第三方包来扩展其功能。本指南将 演示如何导入包并将其整合到您的 Go 项目中。

前提条件

要学习本指南,您需要准备好以下组件:

步骤 1 – 安装 Go

我们已经讨论过安装核心 Go 编程语言在 Ubuntu 20.04 上。然而,还有一个更简单的替代方法: g  (一个轻量级的 Go 版本管理器).

我们之所以要使用 g  是因为 Ubuntu 的包仓库或 snap 中提供的 Go 版本都不是最新的可用 Go 版本 (v1.18 在撰写本指南时)。始终建议使用任何编程语言包的最新可用版本。

以下命令将运行 g  安装脚本:

Import Packages in Go install go

Import Packages in Go installing go 2

要使更改生效,您必须重新启动 shell 会话。重新启动后,验证安装:

Import Packages in Go check go version

安装 Go 之后,还建议安装 gopls 。它是官方的 Go 语言服务器。它与许多文本编辑器兼容,如 VS Code、Vim、Emacs、Sublime Text、Atom 等。运行以下命令:

我们的 Go 编程环境现在已经准备就绪。

步骤 2 – 创建示例 Go 脚本

本指南中演示的所有代码都将放在一个 Go 脚本中。创建一个示例 Go 脚本:

对脚本进行更改后,我们可以使用以下 Go 命令运行它:

在这里,Go 编译器将以解释器模式运行代码。

步骤 3 – 使用标准库包

Go 的标准库中包含大量的集合。它由许多包组成,例如:

  • fmt: 实现了格式化 I/O,其函数类似于 C 的 ( printf  和 scanf ).
  • http: 该包提供了用于创建 Web 服务、通过 http  协议发送和检索数据等功能。

要在 Go 项目中引入任何包,必须使用 import  语句来实现。该语句由 import  关键字以及包的名称来声明。例如,要导入 math/rand ,导入语句将如下所示:

以下代码实现了来自 math/rand  包的各种函数:

此代码演示了一个简单的 for 循环,它在屏幕上打印 10 个随机整数(0 到 24)。这里:

  • rand.Int() : 此函数调用返回一个随机整数。
  • rand.Intn() : 作用类似于 rand.Int()  但接受一个参数,该参数定义了随机整数的范围(从 0 到指定的数字)。

接下来,运行代码:

输出将如下所示:

random number program

请注意,输出将完全相同,因为默认情况下随机数生成器的种子是一个固定值。这就是 伪随机数生成器的特性. 您可以在这里了解更多关于 随机种子的信息.

Step 4 – 导入多个包

更大、更复杂的项目需要引入多个包。如何将它们导入到您的 Go 代码中?一种可行的方法是为每个导入的包使用单独的 import 语句。然而,与以下导入结构相比,这种方法的效率较低:

在这里,单个 import 语句同时引入了多个包。这减少了需要编写的代码量,同时提高了可读性。

以下代码将这一特性付诸实践:

运行代码:

输出结果将类似于:

importing multiple packages

Step 5 – 安装其他 Go 库

Go 的标准库附带了许多有用的包。这些包在设计上是通用的。它使开发人员能够在标准库的基础上创建自己的包,以满足他们的特定需求。请查看官方的 Go 包数据库.

如果您需要实现第三方 Go 包该怎么办?Go 附带了 go install  命令( go get  已被弃用)。它可以从互联网上获取任何第三方 Go 包。

为了进行演示,我们将安装 cobra-cli  包。以下 Go 命令将下载并安装所需的文件,并将该包集成到 Go 库系统中:

install cobra cli

二进制文件 cobra-cli  应该位于以下位置:

list gopath files

其他包文件应该位于以下位置:

list package files

从 Go v1.11 开始,Go 模块定义了您希望导入的包的版本。这里有详细解释: Go Modules GitHub.

Step 6 – 包别名

在各种情况下,您可能会发现本地包和导入包之间存在命名冲突。这就是别名可以解决冲突的地方。别名结构类似于:

让我们修改简单的 Go 程序,以引入 fmt_alias  作为包的别名 fmt :

请注意,我们没有使用 fmt.Printf() ,而是使用了包别名 fmt_alias.Printf() .

然而,Go 并不那么欢迎别名。当您使用别名来避免导入名称冲突时,建议为最本地或特定于项目的导入设置别名。例如,如果您既想要一个本地包 strings  又想要一个系统包 strings ,那么您应该为本地包设置别名,而不是系统包。

最佳实践是首先避免命名冲突。

Step 7 – 导入格式化

我们学习了使用单个 import  语句。如果您有多个导入该怎么办?例如:

导入格式化将包按特定顺序排序,从而提高了代码的一致性。由于它仅对导入的顺序进行排序,因此还可以防止随机提交。它还能避免不必要的代码变动和令人困惑的代码审查。

大多数现代编辑器都会自动为您格式化导入。或者,它们也支持 goimports。在行业中,使用 goimports  来代替手动对导入进行排序。此外, goimports  也能反映代码中的样式变化。

以下是 import  块在应用 goimports 之后可能的样子: :

注意到什么规律了吗?

  • 所有标准库都首先分组在一起。
  • 各组之间用空行隔开,从而提高了代码的可读性。

结语

Go 中的导入(Imports)是一个强大的功能,它允许调用非 Go 内置的函数。虽然标准库提供了许多通用包,但 Go 也支持第三方包。本指南演示了如何导入内置和第三方的 Go 包。

在本指南中,我们使用解释器运行了 Go 程序。然而,为了获得更好的性能,您可以将代码编译为独立的二进制文件。您可以点击此处了解更多关于编译 Go 程序的信息。如果您想了解如何使用 Nginx 部署 Go Web 应用程序,请查看本教程。此外,您还可以查看我们展示如何编写自己的 Go 包的指南.

您是 Go 开发者吗?CloudSigma 提供 Go API 支持,以便与您的项目无缝集成。

祝您计算愉快!

Preslav Dobrev

作者 · CloudSigma

评论

暂无评论。发表第一条评论吧。