August Rush

一个还在努力成长的小火汁!

游龙当归海,海不迎我自来也。

We create our own demons.

You can reach me at augustrush0923@gmail.com
Go语言基础-init函数
发布:2023年08月06日 | 作者:augustrush | 阅读量: 495

init初始化函数

在golang中init函数是初始化函数,可以用来进行一些初始化操作。

每一个Go源文件都可以包含一个init函数,该函数会在main函数执行前被Go运行框架调用。

func init() {
  // 代码块...
}

这种特殊的函数不接收任何参数也没有任何返回值,我们也不能在代码中主动调用它。

当程序启动的时候,init函数会按照它们声明的顺序自动执行。

执行顺序

一个包的初始化过程是按照代码中引入的顺序来进行的,所有在该包中声明的init函数都将被串行调用并且仅调用执行一次。每一个包初始化的时候都是先执行依赖的包中声明的init函数再执行当前包声明的init函数。确保在程序的main函数开始执行时所有的依赖包都已初始化完成。

包初始化函数执行顺序示意图

简单来说,Go中单个源文件执行顺序就是

  1. 先加载全局变量
  2. init函数的调用
  3. main函数的调用
// main.go
package main

import (
    "fmt"
)

var num int = setNum() // first: 全部变量的定义

func setNum() int {
    fmt.Println("main.go的setNum函数执行...")
    return 10
}

func init() { // second: init函数的调用
    fmt.Println("main.go的init函数执行...")

}

func main() { // third: main函数的调用
    fmt.Println("main.go的main函数执行...")
}

// 执行结果:
/*
main.go的setNum函数执行...
main.go的init函数执行...
main.go的main函数执行...
*/

多个源文件都有init函数,执行流程:

// main.go
package main

import (
    "fmt"
    "golang-initFunction/initTest"
)

var num int = setNum() // first: 全部变量的定义

func setNum() int {
    fmt.Println("main.go的setNum函数执行...")
    return 10
}

func init() { // second: init函数的调用
    fmt.Println("main.go的init函数执行...")

}

func main() { // third: main函数的调用
    fmt.Println("main.go的main函数执行...")
    println(initTest.Name)
}
// initTest.go
package initTest

import "fmt"

var Name, Gender, Age string
var num int = setNum()

func setNum() int {
    fmt.Println("initTest.go的setNum函数执行...")
    return 10
}

// 定义一个init函数对变量进行初始化赋值
func init() {
    fmt.Println("initTest.go的init函数执行...")
    Name = "August Rush"
    Gender = "male"
    Age = "22"
}
执行结果:
initTest.go的setNum函数执行...
initTest.go的init函数执行...
main.go的setNum函数执行...
main.go的init函数执行...
main.go的main函数执行...
姓名: August Rush 性别: male 年龄: 22


  • 标签云

  • 支付宝扫码支持一下

  • 微信扫码支持一下



基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建

京ICP备20007446号-1 & 豫公网安备 41100202000460号

网站地图 & RSS | Feed