包是函数和数据的集合,将有相关特性的函数和数据放在统一的文件/目录进行管理,每个包都可以作为独立的单元维护并提供给其他项目进行使用
声明
Go源文件都需要在开头使用package声明所在包,包名告知编译器哪些是包的源代码用于编译库文件,其次包名用于限制包内成员对外的可见性,最后包名用于在包外对公开成员的访问
包名使用简短的小写字母,常与所在目录名保持一致,一个包中可以由多个Go源文件,但必须使用相同包名
声明两个包,路径分别为gpkgname/pkg01和gpkgname/pkg02
导入&调用
在使用包时需要使用import将包按路径名导入,再通过包名调用成员
可通过import每行导入一个包,也可使用括号包含所有包并使用一个import导入
工作目录结构说明:
- bin: 用于放置发布的二进制程序
- pkg: 用于放置发布的库文件
- src: 用于放置源代码
运行:
- 将chapter08/gv目录添加到GOPATH环境变量中
- 编译&运行
-
使用go build编译二进制文件
命令:go build gpkgmain
说明:编译路径gpkgmain下的包,main包,则在当前目录产生以pkgmain命名的二进制程序
-
使用go run运行二进制文件
命令:go run gpkgmain
-
使用go install编译并发布二进制文件
命令:go install gpkgmain
说明:编译并发布路径gpkgmain下的包,main包,则在将编译后的以pkgmain命名的二进制程序拷贝到bin目录
-
使用go install编译发布库文件
命令:go install gpkgname/pkg01
说明:编译并发布路径gpkgname/pkg01下的包,非main包,则在将编译的以包名命名的库文件拷贝到pkg/GOOS_GOARCH目录下
-
使用go install编译发布所有二进制和库文件
命令:go install ./…
说明:编译并发布当前路径下的所有二进制程序和库文件
-
注意:Go语言不允许交叉导入包
导入形式
-
绝对路径导入
在GOPATH目录中查找包
示例:
- import "fmt"
- import "gpkgname/pkg01"
-
相对路径导入
在当前文件所在的目录查找
示例:import "./gpkgname/pkg02"
-
点导入
在调用点导入包中的成员时可以直接使用成员名称进行调用(省略包名)
-
别名导入
当导入不同路径的相同包名时,可以别名导入为包重命名,避免冲突
-
下划线导入
Go不允许包导入但未使用,在某些情况下需要初始化包,使用空白符作为别名进行导入,从而使得包中的初始化函数可以执行
成员可见性
Go语言使用名称首字母大小写来判断对象(常量、变量、函数、类型、结构体、方法等)的访问权限,首字母大写标识包外可见(公开的),否者仅包内可访问(内部的)
main包与main函数
main包用于声明告知编译器将包编译为二进制可执行文件
在main包中的main函数是程序的入口,无返回值,无参数
init函数
init函数是初始化包使用,无返回值,无参数。建议每个包只定义一个。init函数在import包时自动被调用(const->var->init)
标准包
Go提供了大量标准包,可查看:https://golang.google.cn/pkg/
godoc工具
使用godoc命令可以在本地启动golang网站,用于本地查看帮助手册
帮助
-
go list std:查看所有标准包
-
go doc packagename:查看包的帮助信息
-
go doc packagename.element:查看包内成员帮助信息
有疑问加站长微信联系(非本文作者)