包
环境变量
$GOROOT
: Go的安装根目录
$GOPATH
: Go语言编程的工作目录
$GOBIN
:带有main函数的源程序执行go install 时生成的可执行程序安装目录,默认是$GOPATH/bin
$GOOS
: 设置目标操作系统
$GOARCH
:设置目标平台的CPU体系结构
作用域
Go语言有三种类型作用域:
- 全局作用域:任何地方都可以访问,其有两类:Go语言内置的预声明标识符和Go语言包内以大写字母开头的标识符。
- 包内作用域:在Go语言包内定义的以小写字母开头的标识符,他们在本包可见,在其他包不可见。
- 隐式作用域:每个代码块内定义的变量称为“局部变量”,这些局部变量只在当前代码块内可见。
变量覆盖:
里层的局部变量能覆盖外层变量,使得外层同名变量不可见。
包
包的引用路径有两种写法:
全路径引用: 包的绝对路径是$GOROOT/src
或 GOPATH/src
后面包的源码的全路径,标准包只能使用全路径引用。
相对路径引用: 只适用于引用$GOPATH
下的包
包引用格式:
import "fmt"
标准引用方式import F "fmt"
别名引用方式import . "fmt"
省略方式,此时相当于把包fmt的命名空间直接合并到当前程序的命名空间中import _ "fmt"
仅执行包初始化init函数。使用标准格式引用包,但是代码中却没有使用包,编译器会报错。此时可通过这种方式引用,仅执行包的初始化函数(init),没有init函数也不会报错。
注意:
- 一个包可以有多个init函数,包加载会执行全部的init函数,但不能保证执行顺序,所以不建议在一个包中放入多个init函数
- 包不能出现环形引用
- 包重复引用是允许的。编译器会保证d的init函数只会执行一次
go包的初始化:
- 包初始化程序从main函数引用的包开始,逐级查找包的引用,直到找到没有引用其他包的包,最终生成一个包引用的有向无环图
- go编译器会把有向无环图转换为一颗树,然后从树的叶子节点开始逐层向上对包进行初始化。
- 单个包初始化时先初始化常量,然后是全局变量,最后执行包的init函数