golang 多个 init 方法的执行顺序

Nick666

共 981字,需浏览 2分钟

 ·

2021-03-23 13:31

golang 里的 main 函数是程序的入口函数,main 函数返回后,程序也就结束了。golang 还有另外一个特殊的函数 init 函数,先于 main 函数执行,实现包级别的一些初始化操作,那么多个 init 函数的执行顺序是怎么样的呢?让我们实践一下看下结果吧。

目录结构:

├── a
│   └── a.go
├── b
│   └── b.go
└── main.go

main.go 文件代码:

package main

import (
        "fmt"
        "./b"
        "./a"
)

func init() {
    fmt.Println("main init 1")
}

func init() {
    fmt.Println("main init 2")
}

func main() {
    fmt.Println("main")
    a.Add()
    b.Add()
}

a.go 文件代码:

package a

import "fmt"

func init() {
    fmt.Println("a init")
}

func Add() {
    fmt.Println("a Add")
}

b.go 文件代码:

package b

import "fmt"

func init(){
    fmt.Println("b init")
}

func Add(){
    fmt.Println("b Add")
}

输出结果:

 👉 [gotest]  go run main.go
b init
a init
main init 1
main init 2
main
a Add
b Add

结论:

可以看出执行顺序是按照导入包的顺序执行,而不是按照调用先后顺序执行。

init 函数的主要作用:初始化。

init 函数的主要特点:

  1. init 函数先于 main 函数自动执行,不能被其他函数调用;
  2. init 函数没有输入参数、返回值;
  3. 每个包可以有多个 init 函数;
  4. 包的每个源文件也可以有多个 init 函数,这点比较特殊;
  5. 同一个包的 init 执行顺序, golang 没有明确定义,编程时要注意程序不要依赖这个执行顺序。
  6. 不同包的 init 函数按照包导入的依赖关系决定执行顺序。


浏览 203
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报