Go语言有两个神奇的函数:main和init。
main不用说了,它是Go语言默认的入口函数,需要注意的是它只能写在package main模块下
init函数就比较神秘一些,它可以用来做包的初始化,它也不需要传入参数,也不会返回任何值。
从数量的角度来讲
- main函数只能在package main的模块下定义,并且只能定义一次
- init函数可以在任何模块下的任何文件中定义多次
从执行时机来讲
-
init会在包被初始化后自动执行
-
在执行init函数前会进行全局变量的初始化
-
同一个文件中,先定义的先执行;同一个包下不同文件的init函数执行顺序没有被go语言明确定义,不要依赖这个执行顺序
-
main和init都不能显示的被执行,由go语言自己调用
-
init会先于main函数自动执行
-
不同包的init函数按照包导入的依赖关系决定执行的顺序
作用
由上面的一些特点可知init函数的主要用途有
变量初始化
检查/修复状态
注册器
运行计算
举个例子
在Go语言的开发过程中,不允许引用未使用的软件包。所以我们只想执行init函数而不引用软件包中的任何东西时,要用一种特殊的包引用写法,如下:
import _ "github.com/go-sql-driver/mysql"
使用 _ 来告诉代码检查这个引用我并不会显示的调用,这中写法就是为了执行mysql包下的init方法,来初始化mysql的一些驱动。
然后就可以直接使用"database/sql"去连接mysql数据库执行sql语句了。