GoLang 自学系列(二)—— defer
defer 关键字
首先来看官网的定义:
A "defer" statement invokes a function whose execution is deferred to the moment the surrounding function returns, either because the surrounding function executed a return statement, reached the end of its function body, or because the corresponding goroutine is panicking.
就是被标记了 defer 的片段会调用一个函数,这个函数会推迟在周围函数执行完返回后执行。要注意,在最后的说明中还带有 panicking,这是什么呢?
看了官网文档对 panicking 的解释,我认为是就是一个运行期的未知的异常处理程序,比如数组越界就会触发一个 run-time panic。就相当于调用内置函数 panic,并用实现了接口类型 runtime-Error 的值做为参数。触发这个错误就代表着它是未确定的错误。
defer 调用的格式为
DeferStmt = "defer" Expression . // Expression 必须是方法或函数
这里面有个很重要点:
Each time a "defer" statement executes, the function value and parameters to the call are evaluated as usual and saved anew but the actual function is not invoked. Instead, deferred functions are invoked immediately before the surrounding function returns, in the reverse order they were deferred.
每次一个 defer 语句调用,这个普通函数值和参数会被(重点)重新保存,但是实际上并没有调用。而是在环绕函数返回之前立即调用,(重点来了)并且会将标记的 defer 的执行的顺序反转再调用。
举个例子:
// out func
func f() (result int) {
defer func() {
result *= 7
}()
return 6
}
for i := 0; i <= 3; i++ {
defer fmt.Println(i)
}
fmt.Println("==================")
f()
通过之前我们讲的概念和重点,我们大概也知道输出的是什么了。结果我就不放了,大家看到了这篇文章就自己动手去试试吧。
GoLang 自学系列(二)—— defer的更多相关文章
- golang 自学系列(三)—— if,for,channel
golang 自学系列(三)-- if,for,channel 一般情况下,if 语句跟大多数语言的 if 判断语句一样,根据一个 boolean 表达式结果来执行两个分支逻辑. 但凡总是有例外,go ...
- golang 自学系列(四)——debug for vscode
golang 自学系列(四)--(调试)VSCode For Debug 这里如何装 vscode 我就不说了 这里如何在 vscode 正常写代码我也不说了 在能正常用 vscode 写 go 语言 ...
- Golang自学系列
为什么会有这个系列? 因为我要往架构方向靠拢啊. 关于架构,其实架构的书我看了<架构整洁之道>,也有<实现驱动领域设计>.但是我感觉明显还不够,所以我在极客时间买了一个架构相关 ...
- 剑指offer自学系列(二)
题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内,数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次,请找出数组中任一个重复的数字,例如,如果输入长度为7的 ...
- Golang学习系列:(一)介绍和安装
Golang学习系列:(一)介绍和安装 Java程序员带你来到Go的世界,让我们开始探索吧! Go是一种新的语言,一种并发的,带有垃圾回收的.快速编译的语言,它具有一下特点: 他可以在一台计算机上用几 ...
- 前端构建大法 Gulp 系列 (二):为什么选择gulp
系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...
- WPF入门教程系列二十三——DataGrid示例(三)
DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...
- Web 开发人员和设计师必读文章推荐【系列二十九】
<Web 前端开发精华文章推荐>2014年第8期(总第29期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发人员和设计师必读文章推荐【系列二十八】
<Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
随机推荐
- phpstorm XDebug 调试
最近要实现php功能,要提供个接口提供访问,但是我就是个菜鸡,网上找了一堆,所以来提供踩坑心得了 参考文档: https://blog.csdn.net/yinhangbbbbb/article/de ...
- Java_基础(一)
注释 单行注释: // 多行注释: /*开头, */结尾, 可跨行, 可嵌入 public static void main(String[] args/* 哈哈 */) 文档注释: /** 开头, ...
- ci之 core下CodeIgniter源码分析(1)
ci 执行流程 index.php 文件 加载codeigniter文件 codeigniter部分里面加载的: 加载配置文件constants 加载全局公共函数core/Common.php 文件 ...
- leetcode144 longest-palindromic-substring
题目描述 找出给出的字符串S中最长的回文子串.假设S的最大长度为1000,并且只存在唯一解. Given a string S, find the longest palindromic substr ...
- Flink的sink实战之四:自定义
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Docker学习笔记:Alpine镜像+Python3安装+http服务器
编写Dockerfile文件使用最新的Alpine镜像并安装Python3环境,如下: 因为python高于3.4则不会默认安装pip,需要手动安装. 试了很多其他办法都没安装上,唯有下载get-pi ...
- ubuntu下安装ESP8266开发环境步骤中可能出现的问题及解决办法
安装步骤参考如下链接 https://www.jianshu.com/p/e9ce2a60df83 1.在GitHub上拉取代码时发生错误:RPC failed; curl 18 transfer c ...
- nginx&http 第三章 ngx http ngx_http_process_request_line读取和处理HTTP头部的行
在 ngx_http_wait_request_handler 的最后调用了 ngx_http_process_request_line 函数用来处理和解析这次请求的全文 在读事件被触发时,内核套接字 ...
- linux tcp/ip 参数解析
后面整理相关信息/* * TCP option lengths */#define TCPOLEN_MSS 4 //只能出现在SYN段中#define TCPOLEN_W ...
- Dubbo 服务引入-Version2.7.5
1.服务引用原理 Dubbo 服务引用的时机有两个,第一个是在 Spring 容器调用 ReferenceBean 的 afterPropertiesSet 方法时引用服务,第二个是在 Referen ...