惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

M
MIT News - Artificial intelligence
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
博客园 - Franky
腾讯CDC
T
Tailwind CSS Blog
Recent Announcements
Recent Announcements
V
V2EX
N
Netflix TechBlog - Medium
量子位
Jina AI
Jina AI
Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
G
Google Developers Blog
爱范儿
爱范儿
博客园 - 叶小钗
D
Docker
MongoDB | Blog
MongoDB | Blog
D
DataBreaches.Net
T
The Blog of Author Tim Ferriss

远飞闲记

用 OpenClaw 搭建全自动晨间简报系统 Open Claw(🦞龙虾): 新手最常踩的 8 个坑,我帮你踩过了 什么是AI Agent(智能体)? OpenClaw 在微信端使用指南 如何让OpenClaw🦞更好用-调教篇 OpenClaw(龙虾🦞)自主赚钱实验笔记 本地Qwen+云模型:OpenClaw真实体验 AI博客主题开发记 OpenClaw初试记 十年博客路:在AI水文泛滥的时代,为何还在坚守? AI Coding实战吐槽:别被"400刀大神"带偏,这些坑我帮你踩过了! 《相信》把不可能变为可能 我们写的程序被杀毒软件杀了,杀毒软件到底杀了什么? 👋2024 探索Unity单元测试:构建可靠游戏代码的基石 实用小黄鸭调试法 炸裂的Unity割韭菜这事 还是要有信念 您好2023 Docker启动提示虚拟化失败 Golang中配置文件热重载方案 重置博客主题 双链知识管理及logseq使用体验 魔幻的魔都疫情 漫谈国内NFT市场状况 如何在UE4中平衡蓝图与C++的使用 2021时光荏苒,2022可遇可期 UE4(Unreal Engine)本地化资源功能 摈弃:“拥有更多=做的更好的”的观念 鱿鱼游戏
Go Lang的defer声明
2016-12-15 · via 远飞闲记

很多新出的语言中都有 defer 声明,比如:Go、Swift 等我所还不知道的编程语言,最近也特意的去研究了一下关于这个声明的用处和使用建议并在此记录一下,在 swift 和 go lang 中 defer 声明的用法及其概念都是一样的。

defer 简介

defer 语法声明就是延迟执行声明语句后所带的表达式或函数,主要是使用在函数返回以后对函数体内的某些变量或指针执行清理工作,比如:在一个函数内执行打开文件操作,但在调用 open 来获得对文件操作的指针以后,出现了 return 操作这时被打开的文件指针就在程序运行期间被一直未关闭,如果有了 defer 语句我们就可以在 open 以后 defer fp.close() 这样只要在函数返回后就会由执行 defer 语句后面的表达式,整体感觉有了这个声明后让我们的程序变的更简洁并且更可控了.

注意事项

  • 在使用 defer 获取函数里面变量的值时,变量值是获取的时候值,函数体以后对变量的操作和更改并不会 defer 里面该变量的值。
      import "fmt"
      func t(){
       i:=1
       defer fmt.Println(i)//最后返回的值是1,并不会是2
       i++
       return
      }
      t()
      //output: 1
  • 函数内可以有多个 defer 声明,它们的执行顺序是 LIFO(后进先出)的顺序来执行
         func t(){
            for i:=0;i<3;i++{
       defer fmt.Println(i)
            }
      return
         }
         t()
         //output: 2,1,0
  • 可以在 defer 语法声明后边调用执行另一个函数或匿名函数。
      func t(i *int){

        defer func(){ (*i)++ }()
      }

      i:=1
      t(&i)
      fmt.Println(i)
      //output: 2

参考资料