Go語言defer機制詳解與應用

一、defer作用

Go語言的defer關鍵字提供了一種延遲執行機制,它能確保指定的函數調用在當前函數返回前被執行。這一特性常用于資源釋放和異常處理場景。

二、defer基本特性

(1)執行時機:defer 語句會在外層函數返回前執行,無論函數是正常返回還是因 panic 而異常終止。

(2)執行順序:多個 defer 語句按后進先出(LIFO)的順序執行,類似于棧的操作方式。

(3)參數求值:defer 語句的參數在注冊時就已完成求值,而非執行時才進行計算。

三、defer機制

1)參數綁定時機

defer語句中,參數值會在聲明時立即確定。代碼示例如下:

func main() {a := 10// 輸出10defer fmt.Println("defer a:", a)  a = 20// 輸出20fmt.Println("current a:", a)    
}

參數a的值在defer語句出現時就已經固定,運行結果如下:

2)執行順序

執行順序遵循后進先出(LIFO)原則,最后注冊的defer語句將最先執行。代碼示例如下:

func main() {defer fmt.Println("first")defer fmt.Println("second")defer fmt.Println("third")
}

執行如果如下:

3)修改返回值

defer 語句能夠修改具名返回值,但對匿名返回值無效。代碼示例如下:

func main() {defer fmt.Println(deferFuncReturn())
}func deferFuncReturn() (result int) {i := 1defer func() { result++ }()// 實際返回2return i 
}

執行如果如下:

四、應用場景

1)資源釋放

確保正確釋放文件、鎖等資源。代碼示例如下:

file, err := os.Open("test.txt")
if err != nil { return err 
}defer file.Close()

2)鎖管理

避免忘記解鎖導致的死鎖,代碼示例如下:

mu.Lock()
defer mu.Unlock()

3)異常恢復

與recover配合捕獲panic異常,代碼示例如下:

defer func() {if r := recover(); r != nil {fmt.Println("Recovered:", r)}
}()

4)事務處理

確保數據庫事務正確提交或回滾,代碼示例如下:

tx, err := db.Begin()defer func() {if p := recover(); p != nil {tx.Rollback()}
}()

5)性能監控

記錄函數執行時間,代碼示例如下:

func doWork() {start := time.Now()defer func() {fmt.Printf("耗時: %v\n", time.Since(start))}()
}

五、defer使用注意事項

1)避免在循環中使用defer,可能導致資源未及時釋放。

2)對于高頻調用的簡單操作,建議手動釋放資源而非使用defer

3)os.Exit()等強制退出方式會跳過defer的執行。

4)defer中的錯誤容易被忽略,需要特別關注錯誤處理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93264.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93264.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93264.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

服務器安全防護詳細介紹

一、方案概述隨著信息技術的飛速發展,服務器作為企業數據存儲、業務運行的核心載體,其安全性至關重要。本服務器安全防護方案旨在通過多層次、全方位的安全防護策略,構建一個完整的服務器安全防護體系,有效抵御各類安全威脅&#…

網站與政務新媒體自查情況的報告工具功能

要高效地完成網站與政務新媒體的自查,并生成報告,通常需要借助專業的自動化巡檢工具。這些工具能夠模擬人工檢查,但速度更快、覆蓋面更廣,并且能將發現的問題匯總成結構化的報告。一、網站與政務新媒體自查報告的工具實現功能這類…

JVM核心原理與實戰優化指南

一、成為卓越的Java開發者 無論你是大學生還是資深工程師,學習JVM都至關重要。你可能是為了: 征服技術面試進行系統調優深入理解Java生態 學習路徑建議: 從Java語言本質切入,逐步深入JVM核心機制,兼顧不同背景學習者…

TCP/IP、socket、http

區分與聯系 TCP/IP 是底層規則,規定數據如何傳輸; Socket 是操作 TCP/IP 的工具,讓程序能實現通信; HTTPS 是上層應用,用 Socket 調用 TCP/IP 協議,實現安全的數據傳輸。 應用層:HTTPS(基于 HTTP + SSL/TLS)| | socket連接了應用層和傳輸層↓ 傳輸層:TCP(可靠…

Go語言中的指針接收者

Go語言中的指針接收者(Pointer Receiver)與Java類中的方法在設計思想上確實有相似之處,尤其在對象狀態修改和性能優化上,但兩者在實現機制和語言哲學上存在顯著差異。以下從核心特性、設計對比和應用場景展開分析:一、…

計算機視覺(opencv)實戰三——圖像運算、cv2.add()、cv2.addWeighted()

圖像運算詳解:加法運算與加權運算在數字圖像處理中,圖像運算是基礎且常用的操作之一。它能夠對兩幅圖像或圖像與常數進行加減乘除,從而實現亮度調整、融合疊加、特效制作等功能。本文將重點介紹 OpenCV 中的圖像加法運算與加權運算&#xff0…

Redis核心架構

一、核心模塊如圖 Client 客戶端,官方提供了 C 語言開發的客戶端,可以發送命令,性能分析和測試等。網絡層事件驅動模型,基于 I/O 多路復用,封裝了一個短小精悍的高性能 ae 庫,全稱是 a simple event-driven…

Python爬蟲大師課:HTTP協議深度解析與工業級請求封裝

Python爬蟲大師課:HTTP協議深度解析與工業級請求封裝 從零構建企業級爬蟲框架(附完整源碼) 一、爬蟲基礎:網絡世界的通行證 ??HTTP協議核心數據??: 全球網站數量:20億 HTTP請求占比:83% …

機器學習——PCA(主成分分析)降維

PCA(主成分分析)降維詳解一、什么是 PCAPCA(Principal Component Analysis,主成分分析)是一種常用的數據降維方法。它通過線性變換將原始的高維數據映射到低維空間,同時盡可能保留原數據的主要信息&#xf…

把 AI 裝進“冰箱貼”——基于超低功耗語音合成的小屏電子價簽

標簽:電子價簽、語音合成、TTS、超低功耗、電子墨水、BLE、離線語音 ---- 1. 背景:價簽也要開口說話? 超市做促銷,顧客拿價簽一掃,“今日番茄 2.99 元/斤,會員再享 9 折” 直接語音播放。 硬件限制&#xf…

挖漏洞是什么意思?挖漏洞賺錢入門到精通,收藏這篇就夠了!

挖漏洞是什么意思?挖漏洞賺錢入門到精通,收藏這篇就夠了! 什么是漏洞挖掘 漏洞挖掘是指通過分析軟件、系統或網絡中存在的安全漏洞來發現并利用這些漏洞。漏洞挖掘是信息安全領域的一項重要工作,可以幫助企業和組織提高系統的安…

如何理解AP中SM中宿主進程?

在AUTOSAR Adaptive Platform(AP)中,狀態管理(State Management, SM)的宿主進程(Host Process) 是實現狀態機運行的核心載體,其本質與運作機制可通過以下結構化解析深入理解&#xf…

無人機光電探測模塊技術分析

一、技術要點1. 多光譜成像技術 可見光與紅外融合:白天依賴可見光高分辨率成像(識別外形、顏色),夜間或低光照條件下切換至紅外熱成像(捕捉0.5℃級溫差),通過雙波段互補提升全天候能力。 激光…

第40周——GAN入門

目錄 目錄 目錄 前言 一、定義超參數 二、下載數據 三、配置數據 四、定義鑒別器 五、訓練模型并保存 總結 前言 🍨 本文為🔗365天深度學習訓練營中的學習記錄博客🍖 原作者:K同學啊 一、定義超參數 import argparse import os i…

Nginx性能優化與安全配置:打造高性能Web服務器

系列文章索引: 第一篇:《Nginx入門與安裝詳解:從零開始搭建高性能Web服務器》第二篇:《Nginx基礎配置詳解:nginx.conf核心配置與虛擬主機實戰》第三篇:《Nginx代理配置詳解:正向代理與反向代理…

二分算法(模板)

例題1: 704. 二分查找 - 力扣(LeetCode) 算法原理:(二分) 通過遍歷也可以通過,但是二分更優且數據量越大越能體現。 二分思路: 1.mid1 (left right)/2 與 mid2 right (right …

VUE3 學習筆記2 computed、watch、生命周期、hooks、其他組合式API

computed 計算屬性在vue3中,雖然也能寫vue2的computed,但還是更推薦使用vue3語法的computed。在Vue3中,計算屬性是組合式API,要想使用computed,需要先對computed進行引入:import { computed } from vuecomp…

【java面試day13】mysql-定位慢查詢

文章目錄問題💬 Question 1相關知識問題 💬 Question 1 Q:這條sql語句執行很慢,你如何分析呢? A:當一條 SQL 執行較慢時,可以先使用 EXPLAIN 查看執行計劃,通過 key 和 key_len 判…

3分鐘解鎖網頁“硬盤“能力:離線運行VSCode的新一代Web存儲技術

Hi,我是前端人類學(之前叫布蘭妮甜)! “這不是瀏覽器,這是裝了個硬盤。” —— 用戶對現代Web應用能力的驚嘆 隨著Origin Private File System和IndexedDB Stream等新技術的出現,Web應用現在可以在用戶的設…

LT6911GXD,HD-DVI2.1/DP1.4a/Type-C 轉 Dual-port MIPI/LVDS with Audio 帶音頻

簡介LT6911GXD是一款高性能HD-DVI2.1/DP1.4a/Type-c轉Dual-port MIPI/LVDS芯片,兼容 HDMI2.1、HDMI2.0b、HDMI1.4、DVI1.0、DisplayPort 1.4a、eDP1.4b 等多種視頻接口標準。支持4K(38402160)60Hz的DSC直通。應用場景AR/VR設備LT6911GXD 支持高達 4K(384…