国产探花免费观看_亚洲丰满少妇自慰呻吟_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語言程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巨野县| 七台河市| 桓台县| 西充县| 建湖县| 三穗县| 新野县| 攀枝花市| 穆棱市| 彩票| 乌兰察布市| 区。| 甘洛县| 扎囊县| 云阳县| 将乐县| 奉新县| 伊宁县| 揭西县| 宜阳县| 安宁市| 扶余县| 波密县| 玉环县| 武定县| 白河县| 西平县| 新乡县| 庆城县| 和顺县| 洞头县| 耿马| 沧源| 靖江市| 法库县| 苍梧县| 平谷区| 阳原县| 昆山市| 平乐县| 陇南市|