溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

GO語言中Defer如何使用

發(fā)布時間:2021-06-23 16:13:05 來源:億速云 閱讀:138 作者:Leah 欄目:編程語言

這篇文章給大家介紹GO語言中Defer如何使用,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

defer:調用一個被 defer 的函數(shù)時在函數(shù)剛要返回之前延遲執(zhí)行,當函數(shù)無論怎樣返回,某資源必須釋放時,可用這種與眾不同、但有效的處理方式。傳統(tǒng)的例子包括解鎖互斥或關閉文件。

這樣延遲一個函數(shù)有雙重優(yōu)勢:一是你永遠不會忘記關閉文件,此錯誤在你事后編輯函數(shù)添加一個返回路徑時常常發(fā)生。二是關閉和打開靠在一起,比放在函數(shù)尾要清晰很多。

/** * Created with IntelliJ IDEA. * To change this template use File | Settings | File Templates. * Name:Defer */package mainimport ( "fmt" "os" "log" "io")//將文件內容作為一個字符串返回func Contents(filename string) (string) { //打開文件 f, err := os.Open(filename) if err != nil {  log.Printf("%s",err) } fmt.Println("Close前>",f) // 如果f.Close在這里執(zhí)行時就完了。所以用DEFER延時執(zhí)行 // 他應該會在f.Read()接收完后執(zhí)行 (我個人理解) defer f.Close() fmt.Println("Close后>",f) var result []byte buf := make([]byte, 100) for {  n, err := f.Read(buf[0:])  result = append(result, buf[0:n]...)  if err != nil {   if err == io.EOF {    break   }   log.Printf("未接收完關閉了f>%s",err)  // 如果f提前關閉了,打印  } } return string(result)}func main() {
 fileurl := os.Getenv("HOME") filename := fileurl+"/test.txt" fmt.Println(Contents(filename))}

我們可以更好的利用被延遲執(zhí)行函數(shù)時特點

/** * Created with IntelliJ IDEA. * To change this template use File | Settings | File Templates. * Name:Defer */package mainimport ( "fmt"
)func trace(s string) string { fmt.Println("entering:", s) return s}func un(s string) { fmt.Println("leaving:", s)}func a() { defer un(trace("a")) fmt.Println("in a")}func b() { defer un(trace("b")) fmt.Println("in b") a()}func main() { b()}

關于GO語言中Defer如何使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI