兄弟连区块链技术Go语言教程defer使用

上传人:大米 文档编号:432897153 上传时间:2023-12-20 格式:DOCX 页数:4 大小:16.83KB
返回 下载 相关 举报
兄弟连区块链技术Go语言教程defer使用_第1页
第1页 / 共4页
兄弟连区块链技术Go语言教程defer使用_第2页
第2页 / 共4页
兄弟连区块链技术Go语言教程defer使用_第3页
第3页 / 共4页
兄弟连区块链技术Go语言教程defer使用_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《兄弟连区块链技术Go语言教程defer使用》由会员分享,可在线阅读,更多相关《兄弟连区块链技术Go语言教程defer使用(4页珍藏版)》请在金锄头文库上搜索。

1、兄弟连区块链技术Go语言教程defer使用所有的新技术都经历了一些成长的痛苦,区块链技术也一样。但是,尽管它还处于发展 的早期阶段,但它具有改进许多行业、许多应用和系统的巨大潜力。Go语言具有其关键特性。Go语言之所以如此强大,是因为它在服务端的开发中总能抓 住程序员的痛痒需求,用最直接、简单、高效、稳定的方式来解决并实现问题。deferGo语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句。 当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回。特别是当你在进 行一些打开资源的操作时,遇到错误需要提前返回,在返回前你需要关闭相应的资源,不然

2、很容易造成资源泄露等问题。如下代码所示,我们一般写打开一个资源是这样操作的:func ReadWrite() bool file.Open(file)/做一些工作if failureX file.Close()return falseif failureY file.Close()return falsefile.Close()return true我们看到上面有很多重复的代码,Go的defer有效解决了这个问题。使用它后,不但代码量 减少了很多,而且程序变得更优雅。在defer后指定的函数会在函数退出前调用。func ReadWrite() bool file.Open(file)defer

3、 file.Close()if failureX return falseif failureY return falsereturn true如果有很多调用defer,那么defer是采用后进先出模式,所以如下代码会输出4 3 2 1 0for i := 0; i 5; i+ defer fmt.Printf(%d , i)defer给我的第一印象就是,类似java中的try finally 我目前的理解就是,在函数块中使用defer,就是函数对应的有一个栈空间,先进后出。需 要函数结束后调用栈,来出发defer操作。如果,一个对象的创建,很消耗内存,需要及时关闭,defer无法像try f

4、innaly哪样准确。package mainimport fmtimport timetype User struct username stringfunc (this *User) Close() fmt.Println(this.username, Closed !)func main() u1 := &Userjackdefer u1.Close()u2 := &Userlilydefer u2.Close()time.Sleep(10 * time.Second)fmt.Println(Done !)vickylocalhost goroutine$vickylocalhost g

5、oroutine$ go run deferTestl.goDone !lily Closed !jack Closed !vickylocalhost goroutine$实际上,线程Sleep的10秒,u1,和u2早就可以Close()T,但却需要依赖main()函数的结 束,才能defer执行。那么尝试给defer添加内部代码区:package mainimport fmtimport timetype User struct username stringfunc (this *User) Close() fmt.Println(this.username, Closed !)即便加了

6、代码快范围func main() /即便加了代码快范围,依旧也要主函数体结束才执行deferu1 := &Userjackdefer u1.Close()u2 := &Userlily defer u2.Close() time.Sleep(10 * time.Second) fmt.Println(Done !)Done !lily Closed !jack Closed !vickylocalhost goroutine$依旧defer的执行在Done!后。那么如何才能达到try finally哪样准确的Close呢?package mainimport fmtimport timetyp

7、e User struct username stringfunc (this *User) Close() fmt.Println(this.username, Closed !)func main() u1 := &Userjackf(u1) /这样的方式,u1才会不依赖main函数的执行/这样的方式,u2也不会依赖main函数的执行u2 := &Userlily/ m := func() /defer u2.Close()/ u2 do somthing/ / m()func() defer u2.Close()/ u2 do somthing()time.Sleep(10 * time.Second)fmt.Println(Done !)func f(u *User)defer u.Close() / u1 do gomething这样的使用方式,视乎不太合理,但却有存在的必要性。大多数情况下,可以用于u1,u2之 类非常消耗内存,或者cpu,其后执行时间过程且没有太多关联的情况。既保留了 defer的 功能特性,也满足范围精确控制的条件!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号