什么是defer?有什么作用
func main() { example()
fmt.Println("Program continues after panic recovery.")
}
什么是defer?有什么作用
defer 用于延迟函数的执行,它会将函数调用推迟到包含 defer 语句的函数执行完成之后。通常用于资源释放、锁的释放、日志的记录等。
Q: 执行顺序
defer语句是按照后进先出(LIFO)的顺序执行的,即最后一个defer语句会最先执行。
Q: 函数参数是在哪个时刻确定的?
defer语句中的函数参数在 defer 语句被执行时就已经确定了,而不是在函数实际调用时。因此,如果defer语句中有函数参数,这些参数的值是在defer语句执行时就会被计算并保留。
Q: 对性能有没有影响
defer语句的性能影响通常很小,因为它是在函数退出时执行的。但如果在循环中使用了大量的defer语句,可能会导致性能问题,因为defer语句的执行会被延迟到函数退出时,循环可能会在函数退出之前执行许多次。
Q: 在什么情况下会有问题?
如果在循环中使用defer,并且defer中引用了循环变量,由于defer语句的延迟执行特性,可能导致循环结束后函数执行时使用的是最后一次循环变量的值。这被称为"defer在循环中的陷阱"。
for i := 0; i < 5; i++ { defer func() {
fmt.Println(i)
}()
}
上述代码输出的结果是5个5,而不是0到4。避免这种问题的一种方法是在循环体内部创建一个局部变量,将循环变量的值传递给defer中的函数。
Go面向对象是怎么实现的?
Go没有类的概念,而是通过结构体(struct)和接口(interface)来实现面向对象的特性。
- 结构体是一种用户定义的数据类型,可以包含字段(成员变量)和方法(成员函数)。
全站分卷索引 · 29 卷
- 1代码随想录知识星球精华(最强八股文)第五版(Go篇))
- 2Go string 和 []byte 的区别
- 3数组和切片的区别
- 4扩容前后的Slice是一样的吗
- 5Go语言map是有序的还是无序的, 为什么
- 6go里面的map是并发安全的吗?如何并发安全
- 7Go 的错误处理和 Java 的异常处理对比
- 8介绍一下panic和recover
- 9什么是defer?有什么作用
- 10Go并发
- 11进程、线程的区别
- 12什么是go runtine
- 13Go语言中的Channel是什么, 有哪些用途,如何处理阻塞
- 14什么是互斥锁(mutex)?在什么情况下会用到它们?
- 15Mutex有几种模式
- 16goroutine什么情况会发生内存泄漏?如何避免。
- 17Go语言中GC的流程是什么
- 18Go 中的内存逃逸现象是什么?
- 19CAP 理论,为什么不能同时满足
- 20说一下 Gin 的路由怎么实现的
- 21简述slice的底层原理,和数组的区别是什么
- 22defer底层原理
- 23侵入式和非侵入式的区别
- 24goroutine与线程的区别
- 25goroutine在什么情况下会被挂起呢?
- 26GC(垃圾回收)原理 1.5版本
- 27简述Go的垃圾回收机制
- 28协程优势及其通信方式
- 29Go的内存对齐