Go语言中init函数和defer延迟调用关键词详解

 更新时间:2023年03月24日 10:34:33   作者:shockWaveGo  
这篇文章主要介绍了Go语言中init函数和defer延迟调用关键词,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Go语言中init函数和defer延迟调用关键词

golang里面有两个保留函数

        main 函数(只能应用于package main)

        init 函数(能够应用于所有的package)

go程序会自动调用 init()和main() 所以你不能在任何地方调用这两个函数

package main 必须包含一个main 函数,但是每个package中的init函数都是可选的

一个package 里可以写多个init函数,建议每个包中只写一个init函数

单个包中代码执行顺序如下

        main包 --> 常量 -->全局变量 --> init函数 --> main函数 -->exit

多个包之间的代码执行顺序

        先按层级import 包,从最后引入包中加载常量、变量、init(),返回上级包 继续执行 加载常量、变量、init()

defer关键字,延迟调用

go语言中没有其他面向对象的析构函数,但是go语言提供了defer语句用于实现其他面向对象语言的析构函数

defer常用于释放资源、接触锁定以及错误处理等

无论在函数内什么地方注册defer 语句,他都会在所属函数执行完毕后才会执行,并且如果注册了多个的defer语句,他们会按照后进先出(先进后出)得原则执行,所以一些资源我们开后就可以注册defer语句关闭。

package main
import "fmt"
func main(){
    defer fmt.Println("我是第一个被注册,最后被打印,因为defer先进后出")
    fmt.Print("我先被打印")
    defer fmt.Println("我第二个被注册,但是先被打印")
}

补充:go语言中defer关键字(延迟调用)用法你会吗

一.defer关键字介绍:

Go语言中的defer语句会将其后面跟随的语句进行延迟处理,在defer归属的函数(如main函数)即将返回时(即函数快结束),将延迟处理的语句按defer定义的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被defer的语句最先执行

看代码如下呢:

package main
 
import "fmt"
 
// Go语言中的defer语句会将其后面跟随的语句进行延迟处理
// 在defer归属的函数(如main函数)即将返回时(即函数快结束),将延迟处理的语句按defer定义的逆序进行执行
// 也就是说,先被defer的语句最后被执行,最后被defer的语句最先执行
func main() {
	fmt.Println("start...")
	defer fmt.Println("1")
	defer fmt.Println("2")
	defer fmt.Println("3")
	fmt.Println("stop...")
}

而这是运行结果:

start...
stop...
3
2
1

可以看出,start...和stop...先被输出,然后是3 2 1,即Go语言中的defer语句会将其后面跟随的语句进行延迟处理,在defer归属的函数(如main函数)即将返回时(即函数快结束),将延迟处理的语句按defer定义的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被defer的语句最先执行

到此这篇关于Go语言中init函数和defer延迟调用关键词的文章就介绍到这了,更多相关go init函数和defer延迟调用关键词内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GIN的路由以及传参问题

    GIN的路由以及传参问题

    本文主要介绍了GIN的路由以及传参问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 通过Golang实现无头浏览器截图

    通过Golang实现无头浏览器截图

    在Web开发中,有时需要对网页进行截图,以便进行页面预览、测试等操作,本文为大家整理了Golang实现无头浏览器的截图的方法,感兴趣的可以了解一下
    2023-05-05
  • 深入理解Golang中的dig包管理和解决依赖关系

    深入理解Golang中的dig包管理和解决依赖关系

    这篇文章主要为大家详细介绍了golang中dig包的使用方法,探讨其应用场景,并提供一些示例,展示如何结合其他库来更好地实现这些场景,感兴趣的小伙伴可以了解下
    2024-01-01
  • Gin使用swagger生成接口文档的代码示例

    Gin使用swagger生成接口文档的代码示例

    Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful Web 服务,它使用 YAML 或 JSON 格式来定义 API 的结构,本文给大家介绍了Gin使用swagger生成接口文档的代码示例,需要的朋友可以参考下
    2024-06-06
  • go使用makefile脚本编译应用的方法小结

    go使用makefile脚本编译应用的方法小结

    makefile可以看作是make工具的脚本文件, 而make主要用来处理一系列命令。常用的比如用来编译和打包文件, 在C/C++的编译打包中应用最广泛了,这篇文章主要介绍了go使用makefile脚本编译应用,需要的朋友可以参考下
    2022-08-08
  • go-kit组件使用hystrix中间件的操作

    go-kit组件使用hystrix中间件的操作

    这篇文章主要介绍了go-kit组件使用hystrix中间件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 深入理解 Go 语言中的 Context

    深入理解 Go 语言中的 Context

    这篇文章主要介绍了 理解 Go 语言中的 Context,需要的朋友可以参考下
    2020-06-06
  • Go中init()执行顺序详解

    Go中init()执行顺序详解

    go允许定义多个init(),多个init()会涉及到执行先后的问题,本文将详细讲解Go中init()执行顺序,感兴趣的朋友一起看看吧
    2022-09-09
  • golang 中 recover()的使用方法

    golang 中 recover()的使用方法

    这篇文章主要介绍了Guam与golang  recover()的使用方法,Recover 是一个Go语言的内建函数,可以让进入宕机流程中的 goroutine 恢复过来,下文更多相关资料需要的小伙伴可以参考一下
    2022-04-04
  • go语言搬砖之go jmespath实现查询json数据

    go语言搬砖之go jmespath实现查询json数据

    这篇文章主要为大家介绍了go语言搬砖之go jmespath实现查询json数据,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论