前言

有时您的代码需要当前程序之外的其他功能。在这些情况下,您可以使用包来使您的程序更加复杂。包代表磁盘上单个目录中的所有文件。包可以定义您可以在其他 Go 文件或包中引用的函数、类型和接口。

我们可以通过调用各种包或库中的函数可以做一些有用的事情的复杂程序。 Golang 也不例外。在这篇文章中,我们将学习如何在我们的程序中导入 Golang 外部包。

标准库

fmtnet/httphttp
importimport
math/rand
import "math/rand"

当我们导入一个包时,我们将它作为一个单独的命名空间在我们当前的程序中可用。这意味着我们必须用点表示法来引用函数,就像在 package.function 中一样。

math/rand
rand.Int()rand.Intn()
forrandom.gomath/rand
package main

import "math/rand"

func main() {
	for i := 0; i < 10; i++ {
		println(rand.Intn(30))
	}
}

math/randrand.Intn()
go run random.go
$ go run random.go
11
27
17
29
1
18
25
20
16
0

整数永远不会低于 0 或高于 30。

()
import (
  "fmt"
  "math/rand"
)

为了使用附加包,我们现在可以格式化输出并打印出在循环期间生成每个随机数的迭代:

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	for i := 0; i < 10; i++ {
		fmt.Printf("%d) %d\n", i, rand.Intn(30))
	}
}

在本节中,我们学习了如何导入包并使用它们来编写更复杂的程序。到目前为止,我们只使用了标准库中的包。接下来,让我们看看如何安装和使用其他开发人员编写的包。

安装包

虽然标准库附带了许多很棒且有用的包,但它们被有意设计为通用而不是特定的。这允许开发人员根据自己的特定需求在标准库之上构建自己的包。

go get
go getflect
go get github.com/gobuffalo/flect
go get$GOPATH
$GOPATH/src/github.com/gobuffalo/flect

原作者经常更新软件包以解决错误或添加新功能。发生这种情况时,您可能希望使用该软件包的最新版本来利用新功能或解决的错误。要更新包,可以在 go get 命令中使用 -u 标志:

go get -u github.com/gobuffalo/flect

如果在本地找不到该软件包,此命令还将让 Go 安装该软件包。如果已经安装,Go 会尝试将包更新到最新版本。

go get

从 Go 1.11 开始,Go Modules 用于管理要导入的包的版本。包管理的主题超出了本文的范围,但您可以在 Go Modules GitHub 页面上阅读更多相关信息。

别名的方式导入的包

如果您的本地包已经与您正在使用的第三方包命名相同,您可能需要更改包名称。发生这种情况时,为您的导入设置别名是处理冲突的最佳方式。您可以通过在导入的包前面添加别名来修改 Go 中包的名称及其功能。

该语句的构造如下所示:

import another_name "package"

本例中,修改 random.go 程序文件中 fmt 包的名称。我们将 fmt 的包名更改为 f 以便缩写。我们修改后的程序将如下所示:

package main

import (
 f "fmt"
  "math/rand"
)

func main() {
  for i := 0; i < 10; i++ {
    f.Printf("%d) %d\n", i, rand.Intn(25))
  }
}
Printff.Printffmt.Printf

虽然其他语言倾向于为包起别名以便在程序稍后使用,但 Go 不喜欢。例如,将 fmt 包别名为 f 与样式指南不一致。

stringsstrings

在本节中,我们学习了如何为导入设置别名以避免与程序中的另一个导入冲突。重要的是要记住程序的可读性和清晰度很重要,因此您应该只使用别名来使代码更具可读性或需要避免命名冲突。

格式化导入

通过格式化导入,您可以将包排序为特定顺序,这将使您的代码更加一致。此外,当唯一改变的是导入的排序顺序时,这将防止发生随机提交。由于格式化导入将防止随机提交,这将防止不必要的代码搅动和混乱的代码审查。

goimportsgoimports

这是格式化之前的示例导入块的样子:

import (
  "fmt"
  "os"
  "github.com/digital/ocean/godo"
  "github.com/sammy/foo"
  "math/rand"
  "github.com/sammy/bar"
)

运行 goimport 工具(或使用大多数已安装它的编辑器,保存文件将为您运行它),您现在将具有以下格式:

import (
  "fmt"
  "math/rand"
  "os"

  "github.com/sammy/foo"
  "github.com/sammy/bar"

  "github.com/digital/ocean/godo"
)

请注意,它首先将所有标准库包组合在一起,然后将第三方包与空行组合在一起。这使得更容易阅读和理解正在使用的包。

在本节中,我们了解到使用 goimports 将保持我们所有的导入块格式正确,并防止在处理相同文件的开发人员之间发生不必要的代码改动。

总结

当我们导入包时,我们可以调用 Go 中没有内置的函数。有些包是随 Go 一起安装的标准库的一部分,有些我们将通过 go get 安装。

在利用现有代码时,使用包可以让我们的程序更加健壮和强大。我们还可以为自己和其他程序员创建自己的包,以便在未来的程序中使用。