go之defer延迟函数 发表于 2018-12-03 | 分类于 默认分类 | | 阅读次数: go之defer延迟函数 go之defer延迟函数Example1bad1234567891011func do() error { f, err := os.Open("book.txt") if err != nil { return err } defer f.Close() // ..code... return nil} good123456789101112131415161718func do() error { f, err := os.Open("book.txt") if err != nil { return err } defer func() { if err := f.Close(); err != nil { // log etc } }() // ..code... return nil}// 检查可能的错误而不是直接交给 defer 就完事,你可以把 defer 内的代码写成一个帮助函数来简化我们的代码,这里为了讲解方便就没有进行简化。// 还可以通过命名的返回变量来返回 defer 内的错误。 函数不会立即调用 1234567891011121314151617181920func SaveSitemap(cat string) error { fd, err := os.Create("sitemap/sitemap" + cat + ".xml") if err != nil { log.Printf("expected error happended when create BaikeSitemap file %v\n", err.Error()) return err } defer fd.Close() // 这儿close不影响后面 vinfo, err := GenerateSitemap(cat) if err != nil { return err } _, err = fd.Write([]byte(vinfo)) if err != nil { return err } log.Printf(" %v Sitemap 写入成功", NameReverse[cat]) return nil}// defer 会在最后执行 感谢你的打赏哦! 打赏 微信支付 支付宝