📜本文内容
👽包的概念package
- 每个go文件仅属于一个包,一个包可以多个go文件
- 所有包名为小写字母
- 包编译完为pack1.a,包的依赖关系决定程序构建顺序,包为编译单元,每个目录只包含一个包
- 包内文件或重新编译有修改,引用该包的其他程序也要重新编译
- 包名也可作为命名空间使用,eg:pack1.Id, pack2.Id
- 包名自命名,eg:import fm "fmt" fm.Println("hello")
- 导入未使用的包时会报错,导入包的语句后可以定义全局变量,在本包内都可访问
- 包编译完为pack1.a
👽Go程序的结构
- import包
- 声明常量、全局变量、类型定义
init()若含有,则包首先执行init()且只执行一次,任何文件可以包含任意多个init(),按照声明的顺序执行
1
func init() { /*........*/ }
若是main包,此处写main函数
其他函数
👽Go的执行
- 按顺序导入所有被main包引用的包,每个包执行以下流程:
- 若该包又引入了其他包,从1继续,但每个包只能导入一次
- 相反的顺序初始化变量、常量,有init()执行init()
- 回到main执行一样的初始化和init()过程
👽可见性规则
- 类似java中的public、private关键字
- 标识符以大写字母开头,外部包即可访问,eg:struct Person{},Person对象即可被外部包访问(导出/public)
- 以小写字母,即private,仅包内可见可用
- 在导入一个外部包后,只能够访问该包中导出的对象
👽Go的编译过程
- run: compile and run Go program
- go run执行完后生成归档文件和可执行文件
- go run -a强制编译所有代码
- build: compile packages and dependencies
- go build在目录中执行,将产生与目录同名的可执行文件
- 若编译库源码文件,build完不产生任何结果,build只检查库源码文件的有效性,不输出任何文件
- go build 后不接路径则默认编译的包的路径为当前目录
- -o 指定输出名称
- 过程与go run相似,但最后会将生成的可执行文件移动(不是复制,go run产生的exe不存在了)到目录下
- install: download and install packages and dependencies
- 编译并安装指定的代码包、依赖包
- go install将build命令生成的可执行文件移动到GOPATH/bin下
- 过程与go build类似,但最后安装编译后的结果文件到指定目录
- 命令后可接路径
- 不支持对库源码文件的安装
- get: download and install packages and dependencies
- go get从远程仓库下载
- -d只做下载操作不安装