go语言进阶 init() 函数

go 语言包

在一个项目中通常我们需要引入第三方包,我们来看下 当我们导入一个包的时候 发生了什么:

        首先我们先详细介绍下两个函数 init() main() 是 go 语言中的保留函数我们可以在源码中 定义 init()函数, 此函数会在包导入时执行, 例如 如果是在 main 中导入包,包中存在 init(), 那么 init() 中的代码会在 main() 函数执行前执行。 用于初始化包 所需要的特定材料。 例如:

包代码:

src/userPackage/tool.go

package userpackage
import "fmt"
func init(){
    fmt.Println("tool init")
}

主函数代码:

src/main.go

package main
import (
    "userPackage"
)

func main(){
    fmt.Pintln("main run")
    // 使用 userPackage
    userPackage.SomeFunc()
}

 他们在执行时: 会先输出: "tool init" 在输出 "main run"

 init() 函数和 main() 这两个函数的区别:

相同点:

  • 这两个函数都是 go 语言中的保留函数
  • 两个函数在定义是不能有 任何参数返回值
  • 该函数只能由 go 程序自动调用, 不能被引用(自己调用)

不同点:

  • init    可以应用于任意包中,且可以重复定义多个
  • main 函数只能用于 main 包中,切只能定义一个
  • init    主要用于初始化信息的
  • main 程序入口

init() 函数和 main() 函数执行顺序:

  • 在 main 包中的 go 文件默认总是会被执行。
  • 对用同一个 go 文件 init() 调用顺序是从上到下的
    package utils
    import "fmt"
    func init() {
    	fmt.Println("util init0")
    }
    func init() {
    	fmt.Println("util init1")
    }
    
    
    输出:
    util init0
    util init1
    
  • 同一个 package 中的不同文件 文件名安装字符串进行 "从大到小" 排序,之后顺序调用各个文件中的 init 函数
    package utils
    import "fmt"
    func init() {
    	fmt.Println("util init0")
    }
    func init() {
    	fmt.Println("util init1")
    }
    
    
    package utils
    import "fmt"
    func init() {
    	fmt.Println("utilTime init0")
    }
    
    
    
    输出:
    util init0
    util init1
    utilTime init0
    
  • 对于不同的 package, 如果不互相依赖 按照 main 包中  import 的顺序调用其他包中的 init() 函数。
    package main
    import (
    	"fmt"
    	_ "practice_package/utils"
    )
    func init() {
    	fmt.Println("main init")
    }
    func main() {
    	fmt.Println("main  main->run")
    }
    
    输出:
    util init0
    util init1
    utilTime init0
    main init
    main  main->run
    
  • 对于不同的 package,  如果相互依赖 调用顺序为 顺序为最后被依赖的 最先进行初始化。例如:  导入顺序: main ->A ->B ->C, 则 初始化顺序为 C->B->A->mian, 依次执行对应的  init 方法。main 包总是被最后一个初始化。应为它总是 依赖别的包
  • 避免出现循环导入 例如: A->B->C->A;(虽然实际生产不可避免,但还是得尽量避免) 
  • 一个包被多个包  import,  init() 函数只会执行一次

相关推荐

  1. go语言

    2024-06-08 21:14:01       12 阅读
  2. Go语言教程

    2024-06-08 21:14:01       9 阅读
  3. Go语言中的init函数的执行时机

    2024-06-08 21:14:01       36 阅读
  4. go语言篇——接口

    2024-06-08 21:14:01       39 阅读
  5. go语法10问

    2024-06-08 21:14:01       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 21:14:01       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 21:14:01       5 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 21:14:01       4 阅读
  4. Python语言-面向对象

    2024-06-08 21:14:01       6 阅读

热门阅读

  1. Mybatis06-动态SQL

    2024-06-08 21:14:01       13 阅读
  2. 微信小程序动画和Canvas笔记

    2024-06-08 21:14:01       20 阅读
  3. ES5/ES6 的继承除了写法以外还有什么区别?

    2024-06-08 21:14:01       15 阅读
  4. Jetpack compose中State和Kotlin Flow对比

    2024-06-08 21:14:01       17 阅读
  5. django支持https

    2024-06-08 21:14:01       17 阅读
  6. 如何反编译jar并修改后还原为jar

    2024-06-08 21:14:01       17 阅读