返回顶部
首页 > 资讯 > 后端开发 > GO >Golang中defer预计算参数怎么用
  • 946
分享到

Golang中defer预计算参数怎么用

2023-06-29 16:06:39 946人浏览 安东尼
摘要

小编给大家分享一下golang中defer预计算参数怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是deferdefer用来声明一个延迟函数,把这个函数放入到一个栈上, 当外部的包含方法return之前,返回参数

小编给大家分享一下golang中defer预计算参数怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

什么是defer

defer用来声明一个延迟函数,把这个函数放入到一个栈上, 当外部的包含方法return之前,返回参数到调用方法之前调用,也可以说是运行到最外层方法体的"}"时调用。我们经常用他来做一些资源的释放,比如关闭io操作

func doSomething(fileName string) {    file,err := os.Open(fileName)    if err != nil {    panic(err)    }    defer file.Close()}

defer 可以保证方法可以在外围函数返回之前调用。有点像其他言的 try finally

try{}finally{}

Go语言defer预计算参数

Go 语言中所有的函数调用都是传值的,虽然 defer 是关键字,但是也继承了这个特性。假设我们想要计算 main 函数运行的时间,可能会写出以下的代码:

package mainimport ("fmt""time")func main() {startedAt := time.Now()defer fmt.Println(time.Since(startedAt))time.Sleep(time.Second) //休眠一秒}

结果是:

D:\workspace\go\src\test>go run main.go
0s 

运行结果并不符合我们的预期,这个现象背后的原因是什么呢?经过分析,我们会发现调用 defer 关键字会立刻拷贝函数中引用的外部参数,所以 time.Since(startedAt) 的结果不是在 main 函数退出之前计算的,而是在 defer 关键字调用时计算的【defer入栈的时候】,最终导致上述代码输出 0s

我们再来看个简单例子来说明上述解释:

package mainimport ("fmt")func main() {i := 1defer fmt.Println(test(i))i = 100}func test(i int) int {i = i + 1return i} D:\workspace\go\src\test>go run main.go2

当代码运行到defer fmt.Println(test(i))的时候,会把defer右边最外层函数的参数计算完毕,并传递进函数里,但不会执行函数体的代码直到包裹defer的函数返回。我们先看会把defer右边最外层函数的参数计算完毕,并传递进函数里这句话,对应例子就是先把test(i)算出来,此时i=1,计算test(1)得2,然后fmt.Println(2)入栈,等到最后程序运行完了再运行defer结果就是2(但不会执行函数体的代码直到包裹defer的函数返回)。

我们再来看一个例子与匿名函数结合:

package mainimport ("fmt")func main() {i := 1defer func() {fmt.Println(test(i))}()i = 100}func test(i int) int {i = i + 1return i}

结果:

D:\workspace\go\src\test>go run main.go
101  

使用匿名函数,结果是101,相当于i给到test方法的是100,那为什么呢?还是那句话:但不会执行函数体的代码直到包裹defer的函数返回

也就是说他会把整个{ fmt.Println(test(i)) }()函数体入栈,等到最后程序运行完了再运行defer,此时的i是100,运行test后就是101了。

所以你要解决第一个打印为0s的问题,你就可以使用匿名函数来解决,如下:

package mainimport ("fmt""time")func main() {startedAt := time.Now()defer func() {fmt.Println(time.Since(startedAt))}()time.Sleep(time.Second) //休眠一秒}

结果:

D:\workspace\go\src\test>go run main.go
1.0152825s

看完了这篇文章,相信你对“Golang中defer预计算参数怎么用”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网GO频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: Golang中defer预计算参数怎么用

本文链接: https://lsjlt.com/news/325727.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang中defer预计算参数怎么用
    小编给大家分享一下Golang中defer预计算参数怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是deferdefer用来声明一个延迟函数,把这个函数放入到一个栈上, 当外部的包含方法return之前,返回参数...
    99+
    2023-06-29
  • 简单聊聊Golang中defer预计算参数
    目录什么是deferGo语言defer预计算参数总结什么是defer defer用来声明一个延迟函数,把这个函数放入到一个栈上, 当外部的包含方法return之前,返回参数到调用方法...
    99+
    2024-04-02
  • golang中的defer函数怎么用
    本文小编为大家详细介绍“golang中的defer函数怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang中的defer函数怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。golang的defe...
    99+
    2023-07-04
  • golang中defer怎么使用
    这篇文章主要介绍“golang中defer怎么使用”,在日常操作中,相信很多人在golang中defer怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golang中defer怎么使用”的疑惑有所帮助!...
    99+
    2023-07-02
  • Golang中的defer关键字怎么使用
    在Golang中,defer关键字用于注册一个函数调用,该函数会在当前函数执行完成后被执行,无论函数是正常返回还是发生了panic。...
    99+
    2024-03-13
    Golang
  • vue中动态参数与计算属性怎么用
    这篇文章将为大家详细讲解有关vue中动态参数与计算属性怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一,动态参数从 2.6.0 开始,可以用方括号括起来的 JavaScript 表达式作为一个指令的...
    99+
    2023-06-20
  • Golang函数的defer语句在文件关闭中怎么使用
    这篇文章主要介绍了Golang函数的defer语句在文件关闭中怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golang函数的defer语句在文件关闭中怎么使用文章都会有所收获,下面我们一起来看看吧。G...
    99+
    2023-07-06
  • Python中怎么根据输入参数计算结果
    本篇文章给大家分享的是有关Python中怎么根据输入参数计算结果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、问题描述define function,calculate t...
    99+
    2023-06-20
  • 云计算服务器参数怎么查看
    云计算服务器的参数可以通过以下方法查看:1. 登录云计算平台的控制台,进入服务器管理页面。根据不同的云计算平台,具体的路径可能会有所不同。2. 在服务器管理页面,可以查看到已创建的云服务器列表。点击相应的服务器名称或详情按钮,即可进入服...
    99+
    2023-08-09
    云计算服务器 服务器
  • golang不定参数怎么使用
    本篇内容介绍了“golang不定参数怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Golang是一门功能强大的编程语言,它在语法结构...
    99+
    2023-07-05
  • Python怎么根据输入参数计算结果
    本篇内容主要讲解“Python怎么根据输入参数计算结果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么根据输入参数计算结果”吧!说明define function,calculat...
    99+
    2023-06-20
  • golang不定参函数怎么使用
    这篇文章主要介绍了golang不定参函数怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇golang不定参函数怎么使用文章都会有所收获,下面我们一起来看看吧。Golang中的不定参函数是指函数可以接受不同...
    99+
    2023-07-06
  • golang中使用递归计算数组中的平方和
    编程网今天将给大家带来《golang中使用递归计算数组中的平方和》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都...
    99+
    2024-04-04
  • 怎么在函数计算中使用puppeteer
    这篇文章主要介绍了怎么在函数计算中使用puppeteer,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  使用 puppeteer 结合函数...
    99+
    2024-04-02
  • Golang函数的defer语句在文件关闭中的用法
    Golang是一种被广泛应用于Web开发的编程语言,其提供了多种强大的数据类型和语言特性,使得在项目开发中可以更加高效地进行编码。其中一个非常实用的特性就是defer语句,用于在函数返回前执行一段代码。在本文中,我们将讨论如何利用Golan...
    99+
    2023-05-16
    Golang defer 文件关闭
  • Pytorch怎么统计参数网络参数数量
    这篇文章主要介绍了Pytorch怎么统计参数网络参数数量的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Pytorch怎么统计参数网络参数数量文章都会有所收获,下面我们一起来看看吧。Pytorch统计参数网络参数...
    99+
    2023-07-05
  • pytorch LayerNorm参数的用法及计算过程
    说明 LayerNorm中不会像BatchNorm那样跟踪统计全局的均值方差,因此train()和eval()对LayerNorm没有影响。 LayerNorm参数 torch....
    99+
    2024-04-02
  • pytorch怎么获得模型的计算量和参数量
    这篇文章给大家分享的是有关pytorch怎么获得模型的计算量和参数量的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。方法1 自带pytorch自带方法,计算模型参数总量total = sum([...
    99+
    2023-06-15
  • 怎么使用Spring AOP预处理Controller的参数
    这篇文章主要为大家展示了“怎么使用Spring AOP预处理Controller的参数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么使用Spring AOP预处理Controller的参数”...
    99+
    2023-06-20
  • 怎么在Python中使用Operator计算函数
    怎么在Python中使用Operator计算函数?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python可以做什么Python是一种编程语言,内置了许多有效的工具,Pyt...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作