先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注go)
正文
Go语言的延迟语句defer有哪些特点?通常在什么情况下使用?
Go语言的延迟语句(defer statement)具有以下特点:
- 延迟执行:延迟语句会在包含它的函数执行结束前执行,无论函数是正常返回还是发生异常。
- 后进先出:如果有多个延迟语句,它们会按照后进先出(LIFO)的顺序执行。也就是说,最后一个延迟语句会最先执行,而第一个延迟语句会最后执行。
通常情况下,延迟语句在以下情况下使用:
- 资源释放:延迟语句可以用于在函数返回前释放打开的文件、关闭数据库连接、释放锁等资源,以确保资源的正确释放,避免资源泄漏。
- 错误处理:延迟语句可以用于处理函数执行过程中可能发生的错误。通过在函数开始时设置延迟语句,在函数返回前检查错误并进行相应的处理,可以简化错误处理的逻辑。
- 日志记录:延迟语句可以用于在函数返回前记录日志或执行其他的调试操作,以便在函数执行过程中收集相关的信息。
延迟语句的使用可以提高代码的可读性和可维护性,同时确保资源的释放和清理操作按照逆序进行。它是Go语言中一种常用的编程技巧,用于处理资源管理和错误处理等场景。
避坑之旅
实际开发中defer
的使用并不像前面介绍的这么简单,defer
用不好,会陷入泥潭。
下面我从两个角度带大家避坑:
- 首先拆解一下延迟语句的执行,注意Go语言的return语句不是原子性的;
- 另外重点和大家分享一下defer语句后面使用匿名函数和非匿名函数的区别。
拆解延迟语句
避免陷入泥潭的关键是必须深刻理解下面这条语句:
return xxx
上面这条语句经过编译之后,实际上生成了三条指令:
1)返回值 =xxx。
2)调用 defer 函数。
3)空的 return。
第1和第 3 步是return语句生成的指令,也就是说return并不是一条原子指令;
第2步是 defer 定义的语句,这里可能会操作返回值,从而影响最终结果。
下面来看两个例子,试着将return 语句和 defer语句拆解到正确的顺序。
第一个例子:
func f()(r int){
t:=5
defer func(){
t=t+5
}()
return t
}
拆解后:
func f()(r int){
t:=5
//1,赋值指令
r=t
// 2.defer 被插入到赋值与返回之间执行,这个例子中返回值r没被修改过
func(){
t=t+5
}()
//3.空的 return 指令
return
}
这里第二步实际上并没有操作返回值r,因此,main函数中调用f()得到5。
第二个例子:
func f()(r int){
defer func(r int){
r=r+5
}®
return 1
}
拆解后:
func f() (r int) {
//1.赋值
r=1
//2.这里改的r是之前传进去的r,不会改变要返回的那个r值
func(r int) {
r=r+5
}®
// 3. 空的 return
return
}
第二步,改变的是传值进去的r,是形参的一个复制值,不会影响实参r。因此,main函数中需要调用f()得到1。
defer匿名函数
在Go语言中,使用匿名函数作为defer的参数时,可以理解为:defer语句中的匿名函数在包裹该defer语句的函数返回后才执行。这是因为defer语句的执行时机是在包裹函数即将返回之前,但在实际返回之前。
为什么不是在return语句之前执行呢?这是因为defer语句的设计初衷是为了在函数返回之前执行一些清理操作,例如关闭文件、释放资源等。将defer语句放在return语句之后,可以确保在函数返回之前执行这些清理操作,保证函数的执行完整性和资源的正确释放。
在使用匿名函数和非匿名函数作为defer的参数时,主要区别在于对函数参数的传递和作用域的影响:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
。**
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-zohEKgd7-1713617396374)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!