golang中的初始化顺序

    1. 一个程序只能有一个main的package. 且pack main 会包含一个main的函数.
    1. pack main会包含多个其他的pack. 这里我们假设还有pack1, pack3.
    1. pack可能还会包含其他的pack. 这里我们假设 pack1. 还包含了 pack2 .
    1. 所有的 pack 都可以包含0个至多个init函数. 没错. 可以有多个init函数... ...
      现在讨论init的调用情况. 结论看起来是
    1. 包之间没有关系的情况下 . 按照import的先后顺序执行. 与包函数的调用顺序无关. ~~~ 静态编译
    1. 看起来是深度递归操作. 永远最先执行最后被包含的pack的init函数.
    1. 同一个pack的多个文件中的init函数是按照文件名的排序来执行的.
    1. 同一个pack的同一个文件也可以有多个init函数.... (神经病). 文本顺序执行.

在一个go文件中, 初始化顺序规则: (1)引入的包 (2) 当前包中的变量常量 (3) 当前包的init (4)main函数

文件结构如下.

.
|-- main.go
|-- pack1
|   |-- pack0.go
|   |-- pack1.go
|   `-- pack11.go
|-- pack2
|   `-- pack2.go
`-- pack3
    `-- pack3.go

代码见
https://github.com/sssandy/golang_test/tree/master/init_test

输出为

test pack3 init
test pack2 init
test pack00 init
test pack1 init before
test pack1 init after
test pack11 init
main init
main

ps: 包级别的变量也是这么个初始化顺序. ps 包级别变量初始化在函数初始化之前.

有些时候我们只想执行包的init和包的变量的初始化, 而不使用包的东西
可以使用 import _ xxx

package main

import (
    _ "mylib/fmt"
)

这一篇文章可以一看 https://blog.csdn.net/htyu_0203_39/article/details/50948193

关于golang的包导入 https://www.flysnow.org/2017/03/04/go-in-action-go-package.html

你可能感兴趣的:(golang中的初始化顺序)