面试题 / 3 / 2 / 创建于 3年前 / 更新于 3年前
请在评论区写下你的答案。
Go 程序初始化先于 main 函数,由 runtime 初始化每个导入的包,初始化顺序不是按照从上到下的导入顺序,而是按照解析的依赖关系,没有依赖的包最先初始化。
每个包首先初始化包作用域的常量和变量(常量优先于变量),然后执行包的 init() 函数。同一个包,甚至是同一个源文件可以有多个 init() 函数。init() 函数没有入参和返回值,不能被其他函数调用,同一个包内多个 init() 函数的执行顺序不作保证。
package main import "fmt" func init() { fmt.Println("init1:", a) } func init() { fmt.Println("init2:", a) } var a = 10 const b = 100 func main() { fmt.Println("main:", a) } // 执行结果 // init1: 10 // init2: 10 // main: 10
一句话总结: import –> const –> var –> init() –> main()
在导入数据库驱动包时其实就是使用到驱动包中init函数
我要举报该,理由是:
Go 程序初始化先于 main 函数,由 runtime 初始化每个导入的包,初始化顺序不是按照从上到下的导入顺序,而是按照解析的依赖关系,没有依赖的包最先初始化。
每个包首先初始化包作用域的常量和变量(常量优先于变量),然后执行包的 init() 函数。同一个包,甚至是同一个源文件可以有多个 init() 函数。init() 函数没有入参和返回值,不能被其他函数调用,同一个包内多个 init() 函数的执行顺序不作保证。
一句话总结: import –> const –> var –> init() –> main()
在导入数据库驱动包时其实就是使用到驱动包中init函数