某网站突然不能浏览了,做网站需要哪些方面的支出,wordpress文章采集,郓城县住房和城乡建设局网站前言
go 语言中有一个非常神奇的函数 init ,它可以在所有程序执行开始前被执行#xff0c;并且每个 package 下面可以存在多个 init 函数#xff0c;我们一起来看看这个奇怪的 init 函数。
init 特性
init 函数在 main 函数之前执行#xff0c;并且是自动执行#xff1b…前言
go 语言中有一个非常神奇的函数 init ,它可以在所有程序执行开始前被执行并且每个 package 下面可以存在多个 init 函数我们一起来看看这个奇怪的 init 函数。
init 特性
init 函数在 main 函数之前执行并且是自动执行每个 package 中可以存在多个 init 函数每个 package 中的源文件也可以存在多个 init 函数init 函数没有输入参数返回值也没有声明无法引用不同的 package 中的 init 函数按照包导入的依赖关系决定执行顺序无论包被导入多少次init 函数只会执行一次。
init 的执行顺序 这张图清晰反应了 init 函数的加载顺序
优先级最高的是 package 加载先层层递归进行包加载每个包中的加载顺序是const - var - init
变量的初始化顺序
针对变量的初始化顺序GO 官方文档有一个例子 这个例子的初始化顺序d - b - c - a变量的初始化顺序是按照出现的顺序进行先后加载的如果某个变量需要依赖其他变量则被依赖的变量先初始化
package 中多个 init 的执行顺序
GO 官方文档对这个有专门的说明
如果当前包下有多个 init 函数首先按照源文件名的字典序从前往后执行若一个文件中出现多个 init 函数则按照出现顺序从前往后进行执行
加载顺序总结
从当前包开始如果当前包 import 了多个依赖包先加载依赖包层层递归初始化各个包 在每一个包中按照源文件的字典序从前往后执行 每一个源文件中 优先初始化常量变量最后是 init 函数当出现多个 init 函数时则按照出现的顺序从前往后一次执行 每一个包都初始化完成后递归返回 初始化当前包。
init 的使用场景
服务注册数据库缓存等中间件的初始化连接
init 注意事项
开发时尽量不要依赖 init 的顺序,复杂的逻辑不要使用 init 函数init 函数不能在代码中被显式调用不能被引用,导入包不要出现循环依赖,导入包仅仅想使用这个包的 init不使用其他方法可以加上下划线_ ,例如import _ cumsuter_package,init 不应依赖 main函数里面创建的变量因为 init 先于 main 执行。