详解go语言中的init()函数(代码片段)

知其黑、受其白 知其黑、受其白     2022-12-15     222

关键词:

阅读目录

Go init 函数的详细说明

初始化每个包后,会自动执行 init()函数,并且执行优先级高于主函数的执行优先级。
init 函数通常用于:

  • 变量初始化
  • 检查 / 修复状态
  • 注册器
  • 运行计算

包初始化

为了使用导入的程序包,必须首先对其进行初始化。

初始化始终在单个线程中执行,并且以程序包依赖关系的顺序执行。这由 Golang 的运行时系统控制,如下图所示:

  • 初始化导入的包(递归导入)
  • 计算并为块中声明的变量分配初始值
  • 在包中执行初始化函数


initial.go

package main
import "fmt"

var _ int64=s()

func init()
  fmt.Println("init function --->")

func s() int64
  fmt.Println("function s() --->")
  return 1

func main()
  fmt.Println("main --->")

执行结果

function s() —>
init function —>
main —>

即使程序包被多次导入,初始化也只需要一次。

特性

init 函数不需要传入参数,也不需要返回任何值。与 main 相比,init 没有声明,因此无法引用。

package main

import "fmt"

func init()
  fmt.Println("init")


func main()
  init()

编译上述函数 “undefined:init” 时发生错误。

每个源文件可以包含一个以上的 init 函数,请记住,写在每个源文件中的 “行进方式” 只能包含一个 init 函数,这有点不同,因此进行下一个验证。

package main

import "fmt"

func init()
  fmt.Println("init 1")


func init()
  fmt.Println("init2")


func main()
  fmt.Println("main")


/* 实施结果:
init1
init2
main */

从上面的示例中,您可以看到每个源文件可以包含多个 init 函数。

初始化函数的一个常见示例是设置初始表达式的值。

var precomputed=[20]float64

func init()
  var current float64=1
  precomputed[0]=current
  for i:=1;i<len(precomputed);i++
    precomputed[i]=precomputed[i-1]*1.2
  

因为不可能在上面的代码 (这是一条语句) 中将 for 循环用作预先计算的值,所以可以使用 init 函数来解决此问题。

Go 套件汇入规则的副作用

Go 非常严格,不允许引用未使用的软件包。

但是有时您引用包只是为了调用 init 函数进行一些初始化。
空标识符 (即下划线) 的目的是解决此问题。

import _ "image/png"

3.3go语言中的main函数和init函数(代码片段)

...已经发现,所有的例子都包含main函数,这也是Go语言中较为特殊的函数。执行的入口函数为main()不接受参数,也不返回参数不需要显示调用每个包都必须要包含单个main包和main()函数由于使用了很多次,这里就不再... 查看详情

3.3go语言中的main函数和init函数(代码片段)

...已经发现,所有的例子都包含main函数,这也是Go语言中较为特殊的函数。执行的入口函数为main()不接受参数,也不返回参数不需要显示调用每个包都必须要包含单个main包和main()函数由于使用了很多次,这里就不再... 查看详情

go包中的init()函数(代码片段)

https://tutorialedge.net/golang/the-go-init-function/-----------------------------------------------------------------------Therearetimes,whencreatingapplicationsinGo,thatyouneedtobeabletosetupsomefor 查看详情

go语言中init函数作用(代码片段)

init函数作用执行Go语言的sync.Once操作;有些不能使用初始化表达式的变量,可以在init函数中初始化;先于普通函数执行一些操作。init函数特点init函数是先于main函数执行;packagemainimport"fmt"funcinit()fmt.Println(&#... 查看详情

go语言init函数(代码片段)

Go语言init函数Goinit函数用途init()函数会在每个包完成初始化后自动执行,并且执行优先级比main函数高。init函数通常被用来:对变量进行初始化检查/修复程序的状态注册运行一次计算包的初始化为了使用导入的包,首先必须将其... 查看详情

go语言中init()函数介绍及执行顺序(代码片段)

Go语言中init()初始化函数init()函数介绍在Go语言程序执行时导入包语句会自动触发包内部init()函数的调用。需要注意的是:init()函数没有参数,也没有返回值。init()函数在程序运行时,自动自动被调用执行,不能在... 查看详情

go语言中init函数作用(代码片段)

init函数作用执行Go语言的sync.Once操作;有些不能使用初始化表达式的变量,可以在init函数中初始化;先于普通函数执行一些操作。init函数特点init函数是先于main函数执行;packagemainimport"fmt"funcinit()fmt.Println(&#... 查看详情

《go语言精进之路》读书笔记|在init函数中检查包级变量的初始状态(代码片段)

书籍来源:《Go语言精进之路:从新手到高手的编程思想、方法和技巧》一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!附上汇总贴:《Go语言精进之路》读书笔记|汇总_COCOgsta的博... 查看详情

go语言中init()函数介绍及执行顺序(代码片段)

Go语言中init()初始化函数init()函数介绍在Go语言程序执行时导入包语句会自动触发包内部init()函数的调用。需要注意的是:init()函数没有参数,也没有返回值。init()函数在程序运行时,自动自动被调用执行,不能在... 查看详情

1go基础(代码片段)

1、Go语言最主要的特性自动垃圾回收更丰富的内置类型函数多返回值错误处理匿名函数和闭包类型和接口并发编程反射语言交互性2、$GOPATH目录约定有三个子目录src存放源代码(比如:.go.c.h.s等)按照golang默认约定,gorun,goinstall等... 查看详情

init函数与main函数(代码片段)

init函数与main函数init函数go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性。有下面的特征:init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等每个包可以拥有多个init函... 查看详情

go语言自学系列|golanginit函数(代码片段)

视频来源:B站《golang入门到项目实战[2021最新Go语言教程,没有废话,纯干货!持续更新中...]》一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!附上汇总贴ÿ... 查看详情

golang/go语言go语言中包的使用init()函数协程和接口(代码片段)

1.包srC目录是以代码包的形式组织并保存Go源码文件的。每个代码包都和src目录下的文件夹一一对应。每个子目录都是一个代码包。一个目录下的同级文件归属一个包。也就是说,在同一个包下面的所有文件的package名,都... 查看详情

go语言中的函数(代码片段)

...递数据,返回值,函数将处理好的数据传递给调用者。Go语言中函数被称为一等公民(first-class)。意味着支持高阶函数,支持匿名函数,支持闭包等特性,可以满足接口等高级函数特性。2定义语法:定义:func函数名( 查看详情

gstreamerplugin注册流程详解(代码片段)

1、从plugin_init()函数 gstreamer插件,直接就是经过plugin_init()函数注册到Gstreamer中的,每一个plugin都是在plugin_init()函数中经过gst_element_register()函数将plugin的相应信息注册到gstreamer中。函数如下:staticgbooleanplugin_init(G 查看详情

init函数与main函数(代码片段)

init函数与main函数init函数go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性。有下面的特征:init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等每个包可以拥有多个init函... 查看详情

go语言理论一(代码片段)

阅读目录理论Go语言的主要特征UTF-8和Unicode有何区别?Go语言命名Go语言内置函数内置接口errorinit函数init函数和main函数的异同Go语言内置的运算符算数运算符关系运算符逻辑运算符位运算符赋值运算符基本类型byte和rune类型数... 查看详情

go语言容器(container)(代码片段)

阅读目录Go语言容器(container)Go语言数组详解Go语言数组的声明比较两个数组是否相等遍历数组—访问每一个数组元素Go语言多维数组简述Go语言切片详解从数组或切片生成新的切片1)从指定范围中生成切片2)表示原有的切... 查看详情