go語言學習之延遲執行語句

 

 

 

// GO 語言defer(延遲執行語句) // Go 語言的 defer 語句會將其後面跟隨的語句進行延遲處理。 // 在 defer 歸屬的函數即將返回時,將延遲處理的語句按 defer 的逆序進行執行, // 也就是說,先被 defer 的語句最後被執行,最後被 defer 的語句,最早被執行。
package main import( "fmt"
   "sync"
   "os"
   "strconv" ) func PrintStr(str string){ fmt.Println(str) } func testDeferOrder(){ PrintStr("函數開始執行") str := "延遲調用函數" defer PrintStr(str + "1") defer PrintStr(str + "2") defer PrintStr(str + "3") PrintStr("函數結束執行") } var ( // 一個演示用的映射
    valueByKey      = make(map[string]int) // 保證使用映射時的併發安全的互斥鎖
 valueByKeyGuard sync.Mutex ) func readValue(key string) int { valueByKeyGuard.Lock() // defer後面的語句不會立刻調用, 而是延遲到函數結束時調用
 defer valueByKeyGuard.Unlock() return valueByKey[key] } func fileSize(filename string) int64 { f, err := os.Open(filename) if err != nil { return 0 } // 延遲調用Close, 此時Close不會被調用
 defer f.Close() info, err := f.Stat() if err != nil { // defer機制觸發, 調用Close關閉文件
        return 0 } size := info.Size() // defer機制觸發, 調用Close關閉文件
    return size } func main(){ // 測試執行順序
 testDeferOrder(); // 使用延遲執行語句在函數退出時釋放資源 // 1 使用延遲併發解鎖
    readValue("這個函數複用的別人代碼") // 2 使用延遲釋放文件句柄
    sFileName := "//home//liq-n//桌面//1.png" fmt.Println("1.png fileSize:" + strconv.FormatInt(int64(fileSize(sFileName))/1024,10) + "KB" ) // fmt.Println(fmt.Sprintf("%d",fileSize("//home//useName//桌面//1.png"))) 
}
相關文章
相關標籤/搜索