本文实例讲述了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语言程序设计有所帮助。
GO语言,Defer,用法
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。