加入收藏 | 设为首页 | 会员中心 | 我要投稿 三明站长网 (https://www.0598zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

GO语言Defer用法实例分析

发布时间:2016-12-04 13:15:10 所属栏目:教程 来源:站长网
导读:本文实例讲述了GO语言Defer用法。分享给大家供大家参考。具体分析如下: defer:调用一个被 defer 的函数时在函数刚要返回之前延迟执行,当函数无论怎样返回,某资源必须释放时,可用这种与众不同、但有效的处理方式。传统的例子包括解锁互斥或关闭文件。

本文实例讲述了GO语言Defer用法。分享给大家供大家参考。具体分析如下:

defer:调用一个被 defer 的函数时在函数刚要返回之前延迟执行,当函数无论怎样返回,某资源必须释放时,可用这种与众不同、但有效的处理方式。传统的例子包括解锁互斥或关闭文件。

这样延迟一个函数有双重优势:一是你永远不会忘记关闭文件,此错误在你事后编辑函数添加一个返回路径时常常发生。二是关闭和打开靠在一起,比放在函数尾要清晰很多。
复制代码 代码如下:/**
nbsp;* Created with IntelliJ IDEA.
nbsp;* To change this template use File | Settings | File Templates.
nbsp;* Name:Defer
nbsp;*/
package main
import (
nbsp;"fmt"
nbsp;"os"
nbsp;"log"
nbsp;"io"
)
//将文件内容作为一个字符串返回
func Contents(filename string) (string) {
nbsp;//打开文件
nbsp;f, err := os.Open(filename)
nbsp;if err != nil {
nbsp;nbsp;log.Printf("%s",err)
nbsp;}
nbsp;fmt.Println("Close前gt;",f)
nbsp;// 如果f.Close在这里执行时就完了。所以用DEFER延时执行
nbsp;// 他应该会在f.Read()接收完后执行 (我个人理解)
nbsp;defer f.Close()
nbsp;fmt.Println("Close后gt;",f)
nbsp;var result []byte
nbsp;buf := make([]byte, 100)
nbsp;for {
nbsp;nbsp;n, err := f.Read(buf[0:])
nbsp;nbsp;result = append(result, buf[0:n]...)
nbsp;nbsp;if err != nil {
nbsp;nbsp;nbsp;if err == io.EOF {
nbsp;nbsp;nbsp;nbsp;break
nbsp;nbsp;nbsp;}
nbsp;nbsp;nbsp;log.Printf("未接收完关闭了fgt;%s",err)nbsp; // 如果f提前关闭了,打印
nbsp;nbsp;}
nbsp;}
nbsp;return string(result)
}
func main() {

nbsp;fileurl := os.Getenv("HOME")
nbsp;filename := fileurl+"/test.txt"
nbsp;fmt.Println(Contents(filename))
}

我们可以更好的利用被延迟执行函数时特点
复制代码 代码如下:/**
nbsp;* Created with IntelliJ IDEA.
nbsp;* To change this template use File | Settings | File Templates.
nbsp;* Name:Defer
nbsp;*/
package main
import (
nbsp;"fmt"

)
func trace(s string) string {
nbsp;fmt.Println("entering:", s)
nbsp;return s
}
func un(s string) {
nbsp;fmt.Println("leaving:", s)
}
func a() {
nbsp;defer un(trace("a"))
nbsp;fmt.Println("in a")
}
func b() {
nbsp;defer un(trace("b"))
nbsp;fmt.Println("in b")
nbsp;a()
}
func main() {
nbsp;b()
}

希望本文所述对大家的Go语言程序设计有所帮助。

(编辑:三明站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!