golang的defer踩坑汇总

变量捕获

defer中的变量会被提前捕获,后续的修改不会影响到已捕获的值,举个例子:

结果defer语句中打印的值是修改前的值。:

最后输出值: 10

Defer运行值: 0

变量名返回值

在defer中修改具体变量名返回值时,会影响到函数的实际返回值,继续举个例子:

非变量名返回值

当函数为非具体名返回值时,defer无法影响返回值(因在return时,对应返回值已存入栈中),继续举个例子:

经过上面的实践理解,我们来看下下面的笔试题:

问题解析:这里return先给result赋值为3,之后执行defer,result变为21,最后返回21。

问题解析:这里return确定返回值3,之后defer才修改result,最后函数返回return确定的返回值3。

问题解析:多个defer函数,按顺序逆序执行,这里输出31 32 33 1 2 3 。

问题解析:由于这里的defer指定的func为nil,所以会panic 。

问题解析:这里是极度容易踩坑的地方,由于defer这里调用的func没有参数,等执行的时候,i已经为0(按3 2 1逆序,最后一个i=1时,i–的结果最后是0),所以这里输出3个0 。

如果还不太好理解?

按照常规的思维理解应该是这样:

感兴趣的朋友可以细细品下。

Original: https://www.cnblogs.com/phpper/p/16389393.html
Author: 周伯通之草堂
Title: golang的defer踩坑汇总

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516279/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Go语言之Goroutine与信道、异常处理

    一、Goroutine Go 协程可以看做成一个轻量级的线程,Go 协程相比于线程的优势: Goroutine 的成本更低大小只有 2 kb 左右,线程有几个兆。 Goroutin…

    Go语言 2023年5月25日
    051
  • golang tcp keepalive研究记录(基于websocket)

    服务器和客户端建立tcp连接以后,客户端/服务器如何知道对方是否挂掉了? 这时候TCP协议提出一个办法,当客户端端等待超过一定时间后自动给服务端发送一个空的报文,如果对方回复了这个…

    Go语言 2023年5月25日
    039
  • Go语言实现文本文件拷贝

    文本文件的读写是程序的常见操作。 这个程序的功能实现文件的拷贝操作,包括了文件的打开、关闭和读写。该程序是按行读入数据文件的内容,然后将其写入到另外一个文件中。 Go语言程序: /…

    Go语言 2023年5月29日
    048
  • Go切片全解析

    目录结构:数组切片 底层结构 创建 普通声明 make方式 截取 边界问题 追加 拓展表达式 扩容机制 切片传递的坑 切片的拷贝 浅拷贝 深拷贝 var n [4]int fmt….

    Go语言 2023年5月25日
    067
  • Golang接口型函数使用技巧

    什么是接口型函数?顾名思义接口函数指的是用函数实现接口,这样在调用的时候就会非常简便,这种方式适用于只有一个函数的接口。 这里以迭代一个map为例,演示这一实现的技巧。 常规接口实…

    Go语言 2023年5月25日
    049
  • Excelize 发布 2.6.0 版本,功能强大的 Excel 文档基础库

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Mic…

    Go语言 2023年5月25日
    072
  • 第十五章:指针类型

    本篇翻译自《Practical Go Lessons》 Chapter 15: Pointer type 1 你将在本章将学到什么? 什么是指针? 什么时指针类型? 如何去创建并使…

    Go语言 2023年5月25日
    052
  • 一次Kafka内存泄露排查经过

    一、现象 服务部署后内存总体呈上升趋势 二、排查过程 通过go tool pprof收集了三天内存数据 2月11号数据: 2月14号数据: 2月15号数据: 我们使用sarama客…

    Go语言 2023年5月25日
    046
  • Go语言实现并行分段求和计算

    这个实例通过循环实现并行的分段求和计算,再把各个子段和加到总和中。 通过这个实例可以了解如何实现循环并行处理,以及有关的编程技巧。 但是这个程序是有问题的,因为可能发生变量访问冲突…

    Go语言 2023年5月29日
    038
  • 基于LSM的Key-Value数据库实现稀疏索引篇

    上篇文章简单的填了一个坑基于LSM数据库的实现了WAL,在该版本中如数据写入到内存表的同时将未持久化的数据写入到WAL文件,在未将数据持久化时程序崩溃,可通过WAL文件将数据还原恢…

    Go语言 2023年5月25日
    067
  • GopherCon SG 2019 “Understanding Allocations” 学习笔记

    本篇是根据 GopherCon SG 2019 “Understanding Allocations” 演讲的学习笔记。 Understanding All…

    Go语言 2023年5月25日
    035
  • Go内存逃逸分析

    Go的内存逃逸及逃逸分析 Go的内存逃逸 分析内存逃逸之前要搞清楚一件事 我们编写的程序中的 函数和 局部变量默认是存放在栈上的(补充一点堆上存储的数据的指针 是存放在栈上的 因为…

    Go语言 2023年5月25日
    038
  • go语言学习笔记-初识Go语言

    Go语言是怎样诞生的? Go语言的创始人有三位,分别是图灵奖获得者、C语法联合发明人、Unix之父肯·汤普森(Ken Thompson)、Plan 9操作系统领导者、UTF-8编码…

    Go语言 2023年5月25日
    064
  • day2-变量与数据类型

    变量 概念:程序的基本组成单位 定义: 指定变量类型 根据值自行判断变量类型(类型推导) 省略var,定义赋值 var i int var i = 10 i, j := 20, 1…

    Go语言 2023年5月25日
    049
  • 10分钟go crawler colly从入门到精通

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Go语言 2023年5月25日
    048
  • Go语言之高级篇beego框架之view

    1、基本语法 go统一使用了{{ 和 }}作为左右标签,没有其它的标签符号。 如果你想要修改为其它符号,可以修改配置文件。 使用.来访问当前位置的上下文 使用$来引用当前模板根级的…

    Go语言 2023年5月29日
    058
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球