golang init 函数
包一个或多个init()函数 每个源可定义多个初始化函数
  func init() {
    fmt.Println("aaa init函数执行")
}
  func init() {
    fmt.Println("aaa init函数执行")
}
执行顺序问题
同包内的init函数 (同源文件内有多个init()函数时执行顺序从上到下)
源文件编译顺序决定顺序的 源文件编译默认是按照文件名排序
不同包的init函数
按照包导入的依赖关系决定顺序
.相同包只会被导入一次
.导入包的顺序 即是 init()函数的执行顺序
包是结构化代码的方式
程序都由包组成 用自身的包或从其它包中导入内容
一 工作空间
编译对源码目录有严格要求 空间 (workspace) 必须由 bin  pkg  src 三个目录组成
二 包结构
代码必须组织在 package 中
• 包由同目录下的多个源码组成
• 包名类似 namespace 与包所在目录名 编译
• 目录名最好 main  all  std 这三个保留名称
• 须包含 package main 函数 main
包声明 package + 包名  必须在源文件中非注释的第一行指明这个文件属于哪个包
package main表示可独立执行的程序
每个Go应用程序都包含一个名为 main 的包
同一个包 package 下面 可以有非常多的不同文件 每个文件的头部都有相同name就可以
如 package oldboy
文件夹名字可以和这个package名称不一致
三 标准库
Go安装文件里包含了可以直接使用的包 即标准库


四 第三方库
go get + 完整包名 保存下载第三方库
在执行go get 命令之前 确保电脑配置了环境变量GOPATH 并且安装git

五 导出包里面的数据
变量 函数 结构体 方法等 首字母大写 则可以被其他的包访问 如果首字母小写 则只能在本包中使用

六 导入包
 1 导入标准库的系统包 import "fmt"
 2 绝对路径导入包 导入 gopath/src/geometry/rectangle包中的内容 "import "geometry/rectangle"
 3 相对路径导入包 导入同一目录下 rectangle 包中的内容 import "./rectangle //仅对 go run main.go 有效"
 4 包重命名模式 导入包并启用别名 import f "fmt //导入fmt 给他起别名f
 5 简便模式,这样可直接使用其内容 而不用再使用其"包名."的模式 import . "fmt" //例如fmt.Println可以直接写为Println
 6 导模式 仅让该包执初始化函数 import _"./rectangle" //仅执行该包内的init函数
未使的导包 被编译器视为错误 (不包括 "import _")

七 初始化
• 每个源⽂件都可以定义⼀个或多个初始化函数
• 编译器不保证多个初始化函数执⾏次序
• 初始化函数在单⼀线程被调⽤ 仅执⾏⼀次
• 初始化函数在包所有全局变量初始化后执⾏
• 在所有初始化函数结束后才执⾏ main.main
• 调初始化函数
• 如果一个包导入了另一个包 被导入的包先初始化
• 尽管一个包可能被包含多次 但是它只被初始化一次
函数形式
func init() {
    f.Println("init")
}
不应该滥⽤初始化函数 仅适合完成当前件中的相关环境设置