国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

GO語言Defer用法實例分析

2020-04-01 19:18:08
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了GO語言Defer用法,實例分析了Defer的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
 

本文實例講述了GO語言Defer用法。分享給大家供大家參考。具體分析如下:

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

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

復制代碼代碼如下:
/**
 * Created with IntelliJ IDEA.
 * To change this template use File | Settings | File Templates.
 * Name:Defer
 */
package main
import (
 "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在這里執行時就完了。所以用DEFER延時執行
 // 他應該會在f.Read()接收完后執行 (我個人理解)
 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))
}

 

我們可以更好的利用被延遲執行函數時特點 

復制代碼代碼如下:
/**
 * Created with IntelliJ IDEA.
 * To change this template use File | Settings | File Templates.
 * Name:Defer
 */
package main
import (
 "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語言程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桑植县| 遵义市| 皋兰县| 吉木乃县| 敦化市| 商水县| 永宁县| 璧山县| 杭州市| 古蔺县| 丘北县| 平塘县| 浦北县| 巴中市| 浦北县| 伊金霍洛旗| 瓮安县| 老河口市| 宁乡县| 古丈县| 如皋市| 从江县| 巴林右旗| 桐梓县| 澄城县| 北宁市| 通许县| 岢岚县| 金华市| 丘北县| 古丈县| 万载县| 龙口市| 嘉禾县| 临漳县| 麻江县| 张掖市| 罗源县| 永登县| 喀喇沁旗| 日照市|