← 返回目录

什么是defer?有什么作用

第 9 / 29 卷日期:

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)来实现面向对象的特性。

  1. 结构体是一种用户定义的数据类型,可以包含字段(成员变量)和方法(成员函数)。
全站分卷索引 · 29 卷
  1. 1代码随想录知识星球精华(最强八股文)第五版(Go篇))
  2. 2Go string 和 []byte 的区别
  3. 3数组和切片的区别
  4. 4扩容前后的Slice是一样的吗
  5. 5Go语言map是有序的还是无序的, 为什么
  6. 6go里面的map是并发安全的吗?如何并发安全
  7. 7Go 的错误处理和 Java 的异常处理对比
  8. 8介绍一下panic和recover
  9. 9什么是defer?有什么作用
  10. 10Go并发
  11. 11进程、线程的区别
  12. 12什么是go runtine
  13. 13Go语言中的Channel是什么, 有哪些用途,如何处理阻塞
  14. 14什么是互斥锁(mutex)?在什么情况下会用到它们?
  15. 15Mutex有几种模式
  16. 16goroutine什么情况会发生内存泄漏?如何避免。
  17. 17Go语言中GC的流程是什么
  18. 18Go 中的内存逃逸现象是什么?
  19. 19CAP 理论,为什么不能同时满足
  20. 20说一下 Gin 的路由怎么实现的
  21. 21简述slice的底层原理,和数组的区别是什么
  22. 22defer底层原理
  23. 23侵入式和非侵入式的区别
  24. 24goroutine与线程的区别
  25. 25goroutine在什么情况下会被挂起呢?
  26. 26GC(垃圾回收)原理 1.5版本
  27. 27简述Go的垃圾回收机制
  28. 28协程优势及其通信方式
  29. 29Go的内存对齐