首页 > 其他分享 >go 并行赋值与defer的关系

go 并行赋值与defer的关系

时间:2024-07-08 13:41:55浏览次数:13  
标签:defer error2 errors 函数 err go New 赋值

在你提供的代码片段中,涉及了变量作用域和闭包的问题,让我们来分析一下为什么输出的是 error2 而不是 error

func msg() (result string) {
    err := errors.New("error")
    defer func() {
        fmt.Println(err) // 这里为啥是error2,而不是error?
    }()
    a, err := "ssss", errors.New("error2") // 这个为啥不会报错?
    fmt.Println(a)

    return
}

 

分析:

  1. 第一部分:err := errors.New("error")

    • 这行代码定义了一个名为 err 的变量,并赋值为 errors.New("error")
  2. 第二部分:defer func() { fmt.Println(err) }()

    • 这里使用了 defer 延迟执行函数,它捕获了外部函数的 err 变量。
    • 注意,这里的 defer 函数中使用的 err 是一个闭包,它会在 msg() 函数返回时执行。在执行时,它捕获的是 msg() 函数返回时的 err 变量的值。
  3. 第三部分:a, err := "ssss", errors.New("error2")

    • 这是一个并行赋值语句,同时定义了变量 a 和新的变量 err
    • a 被赋值为字符串 "ssss"
    • err 被赋值为 errors.New("error2")

为什么输出是 error2 而不是 error

  • defer 延迟执行函数中,输出的 err 变量实际上是在 msg() 函数返回时执行的结果。
  • msg() 函数中,虽然先定义了 err := errors.New("error"),但是后来在并行赋值语句 a, err := "ssss", errors.New("error2") 中又定义了一个新的 err 变量。
  • defer 延迟执行函数内部,闭包捕获的是 msg() 函数返回时的变量状态。由于在执行 msg() 函数过程中,后续的并行赋值语句 err := errors.New("error2") 改变了 err 变量的值,所以在 defer 函数内部输出的是最近的 err 变量,即 errors.New("error2")

总结:

  • 输出的 err 变量是在 defer 延迟执行函数内部捕获的 msg() 函数返回时的值。
  • 并行赋值语句 a, err := "ssss", errors.New("error2") 中重新定义了 err 变量,因此在 defer 函数中捕获的是最近的 err 变量,即 errors.New("error2")

标签:defer,error2,errors,函数,err,go,New,赋值
From: https://www.cnblogs.com/zhanchenjin/p/18289722

相关文章

  • 基于Go 1.19的站点模板爬虫
    创建一个基于Go1.19的站点模板爬虫涉及到几个关键步骤:初始化项目,安装必要的包,编写爬虫逻辑,以及处理和存储抓取的数据。下面是一个简单的示例,使用goquery库来解析HTML,并使用net/http来发起HTTP请求。请注意,实际部署爬虫时,需要遵守目标网站的robots.txt规则和版权政策。首先......
  • django相关问题
    django相关问题orm相关问题1.编写orm在数据库中添加字段,遇到以下内容(.venv)E:\document\py_object\fun_object\wuruntao>pythonmanage.pymakemigrationsItisimpossibletoaddanon-nullablefield'phone'touserwithoutspecifyingadefault.Thisisbecauseth......
  • go return 的时候传递参数给defer
    在Go语言中,defer语句用于延迟执行一个函数直到包含它的函数体执行完毕。在使用defer时,函数的参数会在defer语句执行时被计算,并且函数调用会被延迟执行。如果你希望在函数返回时调用defer语句,并且想要传递一些参数给defer延迟调用的函数,你可以通过将这些参数先保存在变量中,然后在d......
  • 手把手教学!金融行业Google UAC 3.0 广告到底该怎么投?
    浅谈GoogleUAC通用应用广告系列(即UniversalAppCampaigns,简称UAC)是Google于2015年推出的一种旨在为移动应用(MobileApp)寻找更多新用户的广告形式。UAC可覆盖Google用户量最多的各款产品和服务,包括搜索(Search)、展示(Display)、YouTube及GooglePlay应用商店,并可在GoogleAds......
  • WPF ComboBox数据绑定:初始化动态加载ItemsSource后首次赋值Text不显示问题解决
    原来:<ComboBoxText="{BindingItem}"ItemsSource="{BindingItemLists}"></ComboBox>privatevoidParas_Init(){ItemLists=newObservableCollection<string>();ItemLists.Add("111......
  • SpringBoot集成Mongodb文档数据库
    添加Maven依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>配置Mongodb连接信息spring:data:mongodb:host:10.30.29.246......
  • PHP转Go系列 | ThinkPHP与Gin框架之API接口签名设计实践
    大家好,我是码农先森。回想起以前用模版渲染数据的岁月,那时都没有API接口开发的概念。PHP服务端和前端HTML、CSS、JS代码混合式开发,也不分前端、后端程序员,大家都是全干工程师。随着前后端分离、移动端开发的兴起,用后端渲染数据的开发方式效率低下,已经不能满足业务对需求快速......
  • 基于django(爱抚宠物) 小程序设计和实现(源码+LW+部署讲解)
    感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询系统介绍:科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的......
  • Go每日一库之7:fsnotify(跨平台文件监听)
    luckzack作者相关精选 Go每日一库之7:fsnotify(跨平台文件监听)关注作者 腾讯云 开发者社区2核2G云服务器82元/年立即购买>文档建议反馈控制台首页学习活动专区工具TVP最新优惠活动 文章/答案/技术大牛搜索发布登......
  • 【后端面试题】【中间件】【NoSQL】MongoDB查询优化3(拆分、嵌入文档,操作系统)
    拆分大文档很常见的一种优化手段,在一些特定的业务场景中,会有一些很大的文档,这些文档有很多字段,而且有一些特定的字段还特别的大。可以考虑拆分这些文档大文档对MongoDB的性能影响还是很大的,就我个人经验而言,认为可以考虑从两个角度出发拆分大文档:按照字段的访问频率拆分:......