> `init函数`用于包的初始化,常用于初始化包中的变量;这个初始化在`package xxx`的时候完成,也就是在main执行前完成;
## 同一包多个init的执行顺序
> 多个init函数,谁放在前面谁先执行
~~~
package main
import "fmt"
func main() {
fmt.Println("do in main")
}
func init() {
fmt.Println("do in init1")
}
func init() {
fmt.Println("do in init2")
}
~~~
> 运行结果
~~~
do in init1
do in init2
do in main
~~~
## 不同包的init的执行顺序
### 例1 (依赖关系)
> 导入含依赖关系的包,根据先进后出方式执行
**main.go**
~~~
package main
import (
"fmt"
_ "gintest/level1"
)
func main() {
fmt.Println("I am in main")
}
~~~
**/level1/level1.go**
~~~
package level1
import (
"fmt"
_ "gintest/level2"
)
func init() {
fmt.Println("I am in level1")
}
~~~
**/level2/level2.go**
~~~
package level2
import "fmt"
func init() {
fmt.Println("I am in level2")
}
~~~
> 运行结果
~~~
I am in level2
I am in level1
I am in main
~~~
> 执行过程
![](https://img.kancloud.cn/d6/cf/d6cfefac1a462103f5bacc8c35099cea_654x319.png)
### 例2 (非依赖关系)
> 导入非依赖关系的包,先导入先执行
~~~
// main.go
package main
import (
"fmt"
_ "gintest/level1"
_ "gintest/level2"
)
func main() {
fmt.Println("I am in main")
}
~~~
> 执行结果
~~~
I am in level1
I am in level2
I am in main
~~~
- 基础知识
- 开发环境
- 包名规则
- 包初始化 (init)
- 基础数据类型
- 基础类型转换
- 格式化输出
- go指针
- 流程控制语句
- 函数定义
- 匿名函数
- 数组和切片
- map集合
- 结构体
- Interface接口
- 日期处理
- 数学计算
- 正则表达式
- 协程 (并发处理)
- channel
- waitgroup
- mutex (锁机制)
- websocket
- protobuf
- Redis
- 错误处理
- 打包程序
- NSQ消息队列
- 单元测试
- beego
- 安装入门
- Gin
- 快速入门
- 路由与控制器
- 处理请求参数
- 表单验证
- 处理响应结果
- 渲染HTML模版
- 访问静态文件
- Gin中间件
- Cookie处理
- Session处理
- Gin上传文件
- swagger
- pprof性能测试
- GORM
- 入门教程
- 模型定义
- 数据库连接
- 插入数据
- 查询数据
- 更新数据
- 删除数据
- 事务处理
- 关联查询
- 属于 (BELONG TO)
- 一对一 (Has One)
- 一对多 (Has Many)
- 多对多 (Many to Many)
- 预加载 (Preloading)
- 错误处理
- 第三方常用插件
- viper 读取配置文件
- zap 高性能日志
- Nginx代理配置
- Goland 快捷键