網站首頁 編程語言 正文
前言
第一次看go基礎語法的時候,用使用到了defer。但是一直不知道它到底是什么,有什么用途。這幾天通過查詢、學習。算是對defer有了一點淺顯的認識。
1.什么是defer
defer是go中一種延遲調用機制,defer后面的函數只有在當前函數執行完畢后才能執行,通常用于釋放資源。
2.defer的特點
defer遵循先進后出的原則,類似于棧的結構。
補充下:為什么要把defer設計成這種機制?
因為后申請的資源和可能對前面申請的資源有依賴。如果先將前面申請的資源釋放掉了。對于后面的資源可能會造成影響。所以先釋放后申請的資源,再釋放前面申請的資源。
3.defer什么時間執行
前面說到,defer只有在當前函數執行完畢后,才會執行。其實不太準確。
go中的return語句并不是原子性操作,一般是分為兩步:
- 將返回值賦值給一個變量
- 執行RET指令
defer就執行在1之后,2之前。
4.defer常見的坑
1.輸出是多少?
x := 10 defer func(a int) { fmt.Println(a) }(x) x++
答案:
為什么?
因為defer后面的函數在入棧的時候保存的是入棧那一刻的值,而當時x的值是10,所以后期對x修改,并不會影響棧內函數的值。
2.輸出多少
x := 10 defer func(a *int) { fmt.Println(*a) }(&x) x++
答案:
為什么?
這里defer后面函數入棧的時候存入的執行變量x的指針。所以,后期x值改變的時候,輸出結果也會改變。
3.輸出多少
func test()(x int) { x = 10 defer func() { x++ }() return x }
答案:
為什么?
之前我們說過,return并不是原子性操作,是通過一個變量賦值和ret指令來完成的。
而上述例子中,是具名函數。即返回值帶有名字。這樣我們在執行defer的時候相當于修改了返回值的值。所以為11
看到這里,博主想到了閉包。和閉包有沒有關系呢?
4.輸出什么
func test1() int { x := 10 defer func() { x++ }() // ans = x // -------- defer x = x+1 // return x return x }
答案:
為什么?
?
還是return語句的原因,博主已經在代碼中給出提示。可見,非具名函數不會受到相應的影響。
對于defer暫時理解了這些,下次再見。
總結
原文鏈接:https://blog.csdn.net/m0_46251547/article/details/123762669
相關推薦
- 2022-04-27 python?數據挖掘算法的過程詳解_python
- 2022-04-06 關于.Net?6?添加NLog的方法_實用技巧
- 2022-05-12 Kotlin operator方法的重載
- 2022-09-06 C語言模擬實現strstr函數的示例代碼_C 語言
- 2021-12-02 Android創建淡入淡出動畫的詳解_Android
- 2023-01-03 Kotlin文件讀寫與SharedPreferences存儲功能實現方法_Android
- 2023-02-12 詳解C#如何實現隱式類型轉換_C#教程
- 2022-10-13 Android自定義View實現簡單水波紋效果_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支