• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

GO语言Defer用法实例

go 水墨上仙 2294次浏览

defer:调用一个被 defer 的函数时在函数刚要返回之前延迟执行,当函数无论怎样返回,某资源必须释放时,可用这种与众不同、但有效的处理方式。传统的例子包括解锁互斥或关闭文件。
这样延迟一个函数有双重优势:一是你永远不会忘记关闭文件,此错误在你事后编辑函数添加一个返回路径时常常发生。二是关闭和打开靠在一起,比放在函数尾要清晰很多。
(这样说可能不好被理解,可以多试试例子)
来源:http://my.oschina.net/golang/blog/77523

/**
 * Created with IntelliJ IDEA.
 * User: liaojie
 * Date: 12-9-7
 * Time: 下午8:43
 * 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))
}

我们可以更好的利用被延迟执行函数时特点&nbsp

/**
 * Created with IntelliJ IDEA.
 * User: liaojie
 * Date: 12-9-7
 * Time: 下午8:45
 * 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语言Defer用法实例
喜欢 (0)
加载中……