到目前位置,一直将代码放在一个文件里,随着程序变得越来越大、越来越复杂,这会是一个大问题~
使用包在程序之间共享代码
将共享函数移到新的包中!
golang允许定义自己的包,包是一组代码,fmt包格式化输出,math包处理数字,strings包处理字符串,已经在多个程序中使用了来自每一个包的函数。
能够在程序之间使用相同的代码是包存在的主要原因之一。
go工作区目录保存包代码
工作区目录包含三个子目录:
- bin :保存已编译的二进制可执行程序;
- pkg :保存已编译的二进制包文件;
- src :保存go的源代码;
在src中,每个包的代码都位于它自己单独的子目录中,按照惯例,子目录名应与包名相同。
每个包目录应该包含一个或多个源代码文件,文件名不重要,但要以 .go
结尾。
创建一个新包
做一个简单的包:
go
└── src
└── greeting
└── greeting.go
与所有go源代码文件一样,这个文件以package行开始,与其他代码不同,这段代码不是main包的一部分,是一个名为greeting的包的一部分。还有两个函数定义,希望这些函数可以在greeting包之外访问,所以需要首字母大写:
package greeting
import "fmt"
func Hello() {
fmt.Println("Hello!")
}
func Hi() {
fmt.Println("Hi!")
}
将包导入程序
在程序中使用新包:
go
└── src
├── greeting
│ └── greeting.go
└── hi
└── main.go
与每个go源代码文件一样,这段代码从package开始,但希望这是一个可执行的命令,需要使用main的包名。
通常,包名应与所在目录名保持一致,但是main包例外。
package main
import "greeting"
func main() {
greeting.Hello()
greeting.Hi()
}
导入greeting包,该目录名与 import 语句中的名称相匹配。
包使用相同的文件布局
与main包一样,都要有三部分结构: package 子句、import 语句、实际代码。
包命名规范
每次调用包中的函数时都要输入包名,包名遵循以下规则:
- 包名应全部为小写;
- 若含义明显,应缩写;
- 尽可能是一个词,若是两个词,不应该用下划线分隔,第二个词也不应该大写;
- 导入的包名避免与本地变量名冲突;
包限定符
当访问从不同包导出的函数、变量或其他东西时,需要通过在函数或变量前输入包名来限定其名称;当访问定义在当前包中的函数或变量时,不应该限定包名。
常量
许多包导出常量:从不更改的命名值。
声明常量看起来像变量声明,具有名称、可选的类型和常量值,不同点:
- 使用
const
关键字而不是var关键字; - 必须在声明常量时赋值,不能像变量那样后赋值;
- 变量有短变量声明语法,常量没有;
与变量声明一样,可以省略类型,将从分配的值推断:const SquareSides = 4
;
变量的值可以变化,但常量值必须保持不变。
与变量和函数一样,名称以大写字母开头的常量是可导出的。
嵌套的包目录和导入路径
可以将类似的包组嵌套在go工作区的一个目录中,然后该目录将成为它包含的所有包的导入路径的一部分。
使用"go install"安装程序可执行文件
与go build 不同,go install 以包含代码的目录来命名可执行文件。将存储在工作区中名为 bin 的目录中。
设置GOPATH
GOPATH 是一个环境变量,go工具会参考它来查找工作区位置。大多数开发者将所有代码都保存在一个工作区中,但也可以使用 GOPATH 将工作区转移到其他目录。
若代码存储在默认目录之外的地方,需要设置GOPATH: export GOPATH="/xxxx/xxx"
.
发布包
可以在git等仓库中保存代码,这样其他开发人员就可以在自己的项目中使用它。
import (
"fmt"
"github.com/abc/defg"
"log"
)
func main() {
fmt.Print("xxxxxx")
grade, err := defg.GetFloat()
if err != nil {
log.Fatal(err)
}
}
使用"go get"下载和安装包
使用包所在的URL作为导入路径,可以使用go get
自动下载和安装包:go get github.com/abc/defg
.
go将连接到github,下载存储库并将其保存在go工作区的src目录中。
使用"go doc"阅读包文档
可以使用 go doc
命令来显示关于任何包或函数的文档。
例如: go doc strconv
go doc strconv ParsetFloat
使用doc注释记录包
若希望用户看到有关包或函数的文档,需要自己添加。
只需在代码中添加文档注释,直接出现在package子句或函数声明之前的普通go注释将被视为文档注释,将显示在go doc 的输出中。
添加文档注释时,需要遵循一些惯例:
-
注释应该是完整的句子;
-
包注释应以
Package
开头,后跟包名;Package mypackage enable widget management
-
函数注释应以其描述的函数的名称开头;
MyFunction converts widget to gizmos
-
可以通过缩进在注释中包含代码示例;
-
除了代码示例的缩进,不要为了强调或格式化添加额外的标点符号。文档注释将显示为纯文本,并以这种方式进行格式化;
在web浏览器中查看文档
可以在搜索引擎中搜索。
使用"godoc"提供HTML文档
godoc
工具根据主要的go安装和工作区中的代码生成HTML文档。
可以在web服务器模式运行 godoc :godoc -http=:8880
,然后可以在浏览器中访问:http://localhost:8880/pkg
。
“godoc"服务器包含你的包
除了来自go标准库的包之外,godoc 还为go工作区中的任何包构建HTML文档,这些包有可能是第三方的包,也可能是自己写的包。