Go语言的init函数 | 青训营

188 阅读2分钟

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语句了。