首页 > 其他分享 >Go defer 去掉闭包函数,靠谱吗?

Go defer 去掉闭包函数,靠谱吗?

时间:2023-07-25 09:11:37浏览次数:30  
标签:闭包 defer 20 函数 语句 num Go

在Go中使用defer时,如果defer语句包含了一个闭包函数,需要特别小心。因为defer语句会在函数返回时执行,而闭包函数可能会捕获外部变量,导致意想不到的结果。

在Go中,defer语句中的闭包函数捕获的是变量的地址,而不是变量的值。如果闭包函数在defer执行时才被调用,可能会导致捕获的变量值在调用时已经发生了变化。

下面是一个示例代码,演示在defer中使用闭包函数的问题:

package main

import "fmt"

func main() {
    num := 10

    defer func() {
        fmt.Println("Deferred:", num) // 会打印 "Deferred: 20"
    }()

    num = 20
    fmt.Println("Original:", num) // 打印 "Original: 20"
}

  

在上述示例中,我们在defer语句中使用了一个闭包函数,该闭包函数捕获了外部变量num的地址。在函数执行过程中,num的值被修改为20,然后在函数返回时,defer语句执行,闭包函数打印的是捕获的num的地址对应的值,即20。

如果我们想避免这种情况,可以在defer语句中调用一个普通函数,而不是使用闭包函数,以确保在调用defer时已经确定了变量的值。

下面是修复后的示例代码:

 
package main

import "fmt"

func deferredFunc(num int) {
    fmt.Println("Deferred:", num)
}

func main() {
    num := 10

    defer deferredFunc(num)

    num = 20
    fmt.Println("Original:", num) // 打印 "Original: 20"
}

  

在上述示例中,我们使用了一个普通函数deferredFunc来替代闭包函数,在defer语句中调用这个函数。这样,当defer执行时,参数num的值已经确定为10,并不会受到后续的修改影响。

总的来说,为了避免在defer中使用闭包函数可能带来的问题,最好使用普通函数,并确保在defer执行时已经确定了变量的值。这样能够更加安全和可靠地使用defer语句。

 

标签:闭包,defer,20,函数,语句,num,Go
From: https://www.cnblogs.com/shanwei/p/17578839.html

相关文章

  • go语言gorm
    ORM对象关系映射(ObjectRelationalMapping,ORM)。指的是对象和关系之间的映射,使用面向对象的方式操作数据库。关系模型和Go对象之间的映射table=>struct,表映射为结构体row=>object,行映射为实例column=>property,字段映射为属性可以认为ORM是一种高级抽象,对......
  • go install 和 go get的区别
    goinstall和goget都是Go语言中的命令行工具,用于处理依赖关系和安装包。它们的主要区别在于功能和使用场景。goinstall:功能:goinstall命令用于编译并安装指定的包或可执行程序到Go语言的工作空间(GOPATH)的bin目录下。如果没有指定包名,则会安装当前目录下的包或可......
  • 饮冰三年-人工智能-Django淘宝拾遗-85-常用的Python格式化工具
       Python代码格式化对于团队协作、代码质量、错误预防以及与Python社区的契合都具有重要意义。好的代码格式化不仅是一种编码规范,更是一种良好的编码习惯,有助于提高整个项目的质量和可维护性。   在团队中,可能有不同的编码规范和自定义的格式化规则。尽管有一些格式......
  • Python学习笔记:递归、闭包以及装饰器
    一、首先,什么是递归?首先,简单来说递归就是在运行的过程中不断调用自身,从而完成“递”和“归”两个过程。在Python当中递归函数也是这个道理,通过直接或者间接调用函数本身就叫递归函数。注:在Python中编写递归函数一定要有结束条件否则会导致内存溢出。1、Python案例:​ 首先......
  • MongoDB 教程二: 添加, 删除,查询 shell命令
       MongoDBShell常用操作命令MonoDB shell命令操作语法和JavaScript很类似,其实控制台底层的查询语句都是用JavaScript脚本完成操作的。 Ø数据库//1、Help查看命令提示helpdb.help();db.yourColl.help();db.youColl.find().help();rs.help();//2、切换/创建......
  • ssh unable to negotiate
    打开~/.ssh/config文件,在文件最开始添加以下配置并保存:Host*HostkeyAlgorithms+ssh-rsaPubkeyAcceptedAlgorithms+ssh-rsa  MacOSVentura系统ssh不再支持ssh-rsa的原因及解决办法https://blog.twofei.com/881/#solution......
  • PyCharm 在PyCharm中运行Django测试的日志输出
    环境:Windows10  +PyCharm2022.3.3+ Djangoversion4.2.3via: https://docs.djangoproject.com/zh-hans/4.2/topics/logging/#configuring-logging 日志模块配置:在settings.py添加如下配置: importosLOGGING={"version":1,"disable_existi......
  • Golang 规则引擎原理及实战
    本文主要介绍规则引擎在golang中的使用,将首先介绍golang中主要的规则引擎框架,然后利用golang原生的parser搭建一个简单的规则引擎实现基本的bool表达式解析工作。背景随着业务代码的不断迭代,诞生出了越来越多的if-else,并且if-else中的逻辑越来越复杂,导致代码逻辑复......
  • 想在golang里用好泛型还挺难的
    golang的泛型已经出来了一年多了,从提案被接受开始我就在关注泛型了,如今不管是在生产环境还是开源项目里我都写了不少泛型代码,是时候全面得回顾下golang泛型的使用体验了。先说说结论,好用是好用,但问题也很多,有些问题比较影响使用体验,到了不吐不快的地步了。这篇文章不会教你泛型......
  • .net core mongodb增删改查
    .NETCoreMongoDB增删改查实现指南作为一名经验丰富的开发者,我将为你解释如何使用.NETCore和MongoDB来实现数据的增删改查操作。在本文中,我将为你提供一个整体的流程,并提供每一步需要的代码和代码注释。整体流程下面是实现.NETCoreMongoDB增删改查的整体流程,我们将使用C#编......