零基础 go - 33(函数 - init 函数)

0 阅读2分钟

每个源文件都可以包含一个 init 函数,这个函数会在 main 函数执行之前,自动被调用。

init 函数通常用于执行一些初始化操作,比如设置全局变量、注册函数等。

一、示例:

  • 下面的结果会先打印 "This is the init function",然后才会打印 "This is the main function"
  • 因为 init 函数在 main 函数之前被调用。
package main

import "fmt"

func init() {
    fmt.Println("This is the init function")
}

func main() {
    fmt.Println("This is the main function")
}

二、init 函数的注意事项和细节

  • 一个包可以有多个源文件,每个源文件都可以包含一个 init 函数。这些 init 函数会按照文件名的字典序被调用。

  • init 函数不能被其他函数调用,也不能被显式调用。它只能由 Go 运行时自动调用。

  • init 函数没有参数,也没有返回值。它的函数签名必须是 func init()

  • init 函数通常用于执行一些包级别的初始化操作,比如设置全局变量、注册函数、检查环境等。它不适合执行需要传入参数或返回结果的操作。

  • 如果一个文件同时包含全局变量定义、Init函数和main函数,那么它们的执行顺序是:首先执行全局变量的初始化,然后执行init函数,最后执行main函数。

image.png

  • 如果一个包被多个其他包导入,那么这个包的 init 函数会在所有导入它的包的 init 函数之前被调用。这保证了被导入包的初始化先于导入它的包。

  • 如果一个utils包定义了全局变量,main包也定义全局变量,main包引用了utils包,那么utils包的全局变量会先被初始化,然后是utils包的init函数,最后是main包的全局变量和init函数。这是因为Go语言保证了被导入包的初始化先于导入它的包。

image.png