如何编写 Go 包
译者:baiyutang
原文:https://www.digitalocean.com/community/tutorials/how-to-write-packages-in-go
一个包由位于相同目录的 Go 文件组成,这些文件在开头有相同的包声明。你可以从包中包含额外的功能,使您的程序更加丰富。有些包可以通过 Go 标准库获得,因此会随 Go 安装一起安装。其他可以通过 Go 的go get
命令安装。你还可以通过使用必要的包声明,在想要分享代码的同一目录中创建 Go 文件,从而构建自己的 Go 包。
本教程将指导你编写 Go 包,以便在其他程序文件中使用。
准备
设置 Go 编程环境通过以下系列教程《How To Install and Set Up a Local Programming Environment for Go》。按照步骤 5 创建 Go 工作区。要遵循本文中的示例和命名约定,请阅读第一节编写和导入包。
想要深入了解 GOPATH,阅读文章《Understanding the GOPATH》
编写和导入包
编写一个包就想编写其他任意 Go 文件。包可以包含其他 Go 程序能够使用的函数定义、类型和变量。
在我们创建一个新包之前,我们需要进入我们的 Go 工作区,通常在我们的 GOPATH
。例如,在这个教程中,我们将命名包为 greet
。为此,我们创建了一个名为 greet
的目录在我们的项目空间 GOPATH
中。如果我们的组织是 gopherguides
,我们想在组织下创建 greet
包的同时,想用 GitHub 作为我们的代码仓库,那么我们的目录如下:
greet
目录在 gopherguides
目录中:
最后,我们可以在目录中添加第一个文件。常见的做法一个包的主文件或入口文件被命名为目录的名字。在这个案例中,我们将在 greet
目录中创建一个名为 greet.go
:
文件创建后,我们可以开始编写我们想跨项目复用或分享的代码。在这个案例中,我们将创建一个名为 Hello
打印出 Hello World
的函数。
在你的文本编辑器中打开我们的 greet.go 文件,添加如下代码:
让我们分解下第一个文件。每个文件的第一行都需要当前工作的包的名字。因为当前在 greet
里,要使用 package
关键字,后边跟着包的名字:
这将告诉编译器将文件中的所有内容都视为 greet
包的一部分。
接下来,使用 import
语句声明你需要用到的其他包。在这个包你只用到了一个 fmt
包:
最后,创建 Hello 函数,它将使用 fmt 包打印出 Hello, World!
:
现在你已经编写了 greet
包,你可以在创建的其他包使用它。让我们创建一个你将使用 greet
包的新包。
你将创建一个名为 example
的包,意味着你需要一个名为 example
的目录。在你的 gopherguides 组织创建这个包,所以目录结构是这样的:
现在我们已经有了新包的目录,你可以创建入口文件。因为,这将成为一个可执行程序,最佳实践推荐命名入口文件名为 main.go
:
在你的文本编辑器中,打开 main.go
文件并添加如下代码调用 greet
包:
因为你在导入一个包,你需要通过通过点表示法引用来调用一个包。点表示法是指在符号上加上 .
,在正在使用的包的名称与要使用的包中的资源之间。例如,在你的 greet 包中,你有一个 Hello 函数作为资源。如果你想调用资源,你可以使用 greet.Hello()
的点标记法。
现在,你可以打开终端,在命令行运行程序:
之后,你将收到如下输出:
看看怎么在一个包中使用变量。让我们在 greet.go
文件中添加一个变量定义:
接着,打开你的 main.go
文件,添加如下代码在 fmt.Println()
函数中从 greet.go
调用变量变量:
一旦你再次运行程序:
你将收到如下输出:
最后,让我们在 greet.go 文件中定义一个类型。你将创建带有 name
和 color
字段的 Octopus
的类型,还有一个在调用时能够打印它的字段的函数:
打开 main.go
,在文件最后创建这个类型的实例:
一旦你用 oct := greet.Octopus
创建了 Octopus
类型的实现,你可以在 main.go
文件的命名空间内访问函数和类型的字段。这允许你在最后一行编写 oct.String()
,而不调用 greet
。
Octopus
类型的的 String
方法使用了 fmt.Sprintf
函数创建了一个橘子,返回了一个字符结果给调用者。
当你运行程序,你将收到如下输出:
导入的代码
总结
版权声明: 本文为 InfoQ 作者【baiyutang】的原创文章。
原文链接:【http://xie.infoq.cn/article/a3c22804efa5810487ceb2584】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论