写点什么

如何编写 Go 包

用户头像
baiyutang
关注
发布于: 2 小时前
如何编写 Go 包

译者:baiyutang

原文:https://www.digitalocean.com/community/tutorials/how-to-write-packages-in-go


一个包由位于相同目录的 Go 文件组成,这些文件在开头有相同的包声明。你可以从包中包含额外的功能,使您的程序更加丰富。有些包可以通过 Go 标准库获得,因此会随 Go 安装一起安装。其他可以通过 Go 的go get 命令安装。你还可以通过使用必要的包声明,在想要分享代码的同一目录中创建 Go 文件,从而构建自己的 Go 包。


本教程将指导你编写 Go 包,以便在其他程序文件中使用。

准备

  1. 设置 Go 编程环境通过以下系列教程《How To Install and Set Up a Local Programming Environment for Go》。按照步骤 5 创建 Go 工作区。要遵循本文中的示例和命名约定,请阅读第一节编写和导入包。

  2. 想要深入了解 GOPATH,阅读文章《Understanding the GOPATH

编写和导入包

编写一个包就想编写其他任意 Go 文件。包可以包含其他 Go 程序能够使用的函数定义、类型和变量。


在我们创建一个新包之前,我们需要进入我们的 Go 工作区,通常在我们的 GOPATH。例如,在这个教程中,我们将命名包为 greet。为此,我们创建了一个名为 greet 的目录在我们的项目空间 GOPATH 中。如果我们的组织是 gopherguides,我们想在组织下创建 greet 包的同时,想用 GitHub 作为我们的代码仓库,那么我们的目录如下:

└── $GOPATH    └── src        └── github.com            └── gopherguides
复制代码


greet 目录在 gopherguides 目录中:

└── $GOPATH    └── src        └── github.com            └── gopherguides                └── greet
复制代码


最后,我们可以在目录中添加第一个文件。常见的做法一个包的主文件或入口文件被命名为目录的名字。在这个案例中,我们将在 greet 目录中创建一个名为 greet.go

└── $GOPATH    └── src        └── github.com            └── gopherguides                └── greet                    └── greet.go
复制代码


文件创建后,我们可以开始编写我们想跨项目复用或分享的代码。在这个案例中,我们将创建一个名为 Hello 打印出 Hello World 的函数。


在你的文本编辑器中打开我们的 greet.go 文件,添加如下代码:

package greet
import "fmt"
func Hello() { fmt.Println("Hello, World!")}
复制代码


让我们分解下第一个文件。每个文件的第一行都需要当前工作的包的名字。因为当前在 greet 里,要使用 package 关键字,后边跟着包的名字:

package greet
复制代码


这将告诉编译器将文件中的所有内容都视为 greet 包的一部分。


接下来,使用 import 语句声明你需要用到的其他包。在这个包你只用到了一个 fmt 包:

import "fmt"
复制代码


最后,创建 Hello 函数,它将使用 fmt 包打印出 Hello, World!

func Hello() {    fmt.Println("Hello, World!")}
复制代码


现在你已经编写了 greet 包,你可以在创建的其他包使用它。让我们创建一个你将使用 greet 包的新包。


你将创建一个名为 example 的包,意味着你需要一个名为 example 的目录。在你的 gopherguides 组织创建这个包,所以目录结构是这样的:

└── $GOPATH    └── src        └── github.com            └── gopherguides                    └── example
复制代码


现在我们已经有了新包的目录,你可以创建入口文件。因为,这将成为一个可执行程序,最佳实践推荐命名入口文件名为 main.go

└── $GOPATH    └── src        └── github.com            └── gopherguides                └── example                    └── main.go
复制代码


在你的文本编辑器中,打开 main.go 文件并添加如下代码调用 greet 包:

package main
import "github.com/gopherguides/greet"
func main() { greet.Hello()}
复制代码


因为你在导入一个包,你需要通过通过点表示法引用来调用一个包。点表示法是指在符号上加上 . ,在正在使用的包的名称与要使用的包中的资源之间。例如,在你的 greet 包中,你有一个 Hello 函数作为资源。如果你想调用资源,你可以使用 greet.Hello() 的点标记法。


现在,你可以打开终端,在命令行运行程序:

go run main.go
复制代码


之后,你将收到如下输出:

Hello, World!
复制代码


看看怎么在一个包中使用变量。让我们在 greet.go 文件中添加一个变量定义:

package greet
import "fmt"
var Shark = "Sammy"
func Hello() { fmt.Println("Hello, World!")}
复制代码


接着,打开你的 main.go 文件,添加如下代码在 fmt.Println() 函数中从 greet.go 调用变量变量:

package main
import ( "fmt"
"github.com/gopherguides/greet")
func main() { greet.Hello()
fmt.Println(greet.Shark)}
复制代码


一旦你再次运行程序:

go run main.go
复制代码


你将收到如下输出:

Hello, World!Sammy
复制代码


最后,让我们在 greet.go 文件中定义一个类型。你将创建带有 namecolor 字段的 Octopus 的类型,还有一个在调用时能够打印它的字段的函数:

package greet
import "fmt"
var Shark = "Sammy"
type Octopus struct { Name string Color string}
func (o Octopus) String() string { return fmt.Sprintf("The octopus's name is %q and is the color %s.", o.Name, o.Color)}
func Hello() { fmt.Println("Hello, World!")}
复制代码


打开 main.go ,在文件最后创建这个类型的实例:

package main
import ( "fmt"
"github.com/gopherguides/greet")
func main() { greet.Hello()
fmt.Println(greet.Shark)
oct := greet.Octopus{ Name: "Jesse", Color: "orange", }
fmt.Println(oct.String())}
复制代码


一旦你用 oct := greet.Octopus 创建了 Octopus 类型的实现,你可以在 main.go 文件的命名空间内访问函数和类型的字段。这允许你在最后一行编写 oct.String(),而不调用 greet


Octopus 类型的的 String 方法使用了 fmt.Sprintf 函数创建了一个橘子,返回了一个字符结果给调用者。


当你运行程序,你将收到如下输出:

go run main.go
# 输出
Hello, World!SammyThe octopus's name is "Jesse" and is the color orange.
复制代码

导入的代码


总结


发布于: 2 小时前阅读数: 11
用户头像

baiyutang

关注

广州 2017.12.13 加入

Microservices | Golang | Cloud Nitive | “Smart work,Not hard”

评论

发布
暂无评论
如何编写 Go 包