查看: 10121|回复: 28046
打印 上一主题 下一主题

go defer (go延迟函数)

[复制链接]
棋牌类游戏app名称
跳转到指定楼层
楼主
发表于 2019-02-19 09:01:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

然后神侯便是将他知道的一切都告诉了叶扬,听完这神侯的叙述后,叶扬的脸色变得凝重无比。

打麻将赢大米游戏

他以前看香港电影的时候,对于那种黑帮进行交易的场面可是向往了已久。当然,他向往的不是自己去做黑帮,似乎他现在已经是黑帮老大了。他向往的是自己是一个超级警察,将这些坏蛋能够一网打尽。
海龙斗罗点了点头,没有再说什么,仰头看了一眼空中那光芒闪烁的金色光团,抬手拍向海龙圣柱,刹那间,海龙圣柱上那条雕刻着的巨龙仿佛活过来了一般,金色的龙形能量在龙吟声中盘旋而出,直接撞向唐三,从他胸口处透入。同时,龙形能量分出一道金光落在小舞额头处。

而且,达到了九十级的他们,精神力宛如一体,极为凝练,虽然不能与自己相比,但固守自身的情况下,自己想要找机会以精神攻击重创其中之一,那么,自身也必然会受到另一人的强势反扑。

go defer (go延迟函数)


go defer (go延迟函数)

Go语言的defer算是一个语言的新特性,至少对比当今主流编程语言如此。根据GO LANGUAGE SPEC的说法:

A "defer" statement invokes a function whose execution is deferred to the moment the surrounding function returns, either because the surrounding function executed a return statement, reached the end of its function body, or because the corresponding goroutine is panicking. defer语句调用一个函数,这个函数执行会推迟,直到外围的函数返回,或者外围函数运行到最后,或者相应的goroutine panic

换句话说,每当defer执行的时候,它后面的函数值(在go中函数是一个引用类型,是一等公民,可以赋值给变量)和函数参数会被求值,但是函数不会立即调用,直到(↑)上述三种情况发生。 这就是defer的全部内容,没了,剩下就是defer的best practice

函数不会立即调用

先从最简单的开始:

func readFile(fileName string){
	f,err := os.Open(fileName)
	if err!=nil {
		return
	}
	defer f.Close()
	var content [1024]byte
	f.Read(content[:])
	fmt.Printf("%s",content)
}
func main() {
	readFile("test.data")
}

  

程序输出test.data前1024字节的内容。值得一提的是,类似这种open/close配对操作是defer的惯用法。 这个例子诠释了上面那句话的后半段

"但是函数不会被调用" 

因为如果defer后面的f.Close()没有延迟执行,那么文件描述符都关闭了,就不会读取到任何内容。

函数值和函数参数被求值,函数不会立即求值

下面这个例子即将诠释上半段,它来自<>,稍作修改:

func trace(funcName string) func(){
	start := time.Now()
	fmt.Printf("function %s enter
",funcName)
	return func(){
		log.Printf("function %s exit (elapsed %s)",funcName,time.Since(start))
	}
}

func foo(){
	defer trace("foo()")()
	time.Sleep(5*time.Second)
}
func main(){
    foo()
    foo()
}
/*
OUTPUT:
function foo() enter
function foo() exit (elapsed 5.0095471s)
function foo() enter
function foo() exit (elapsed 5.0005382s)
*/

  

为什么foo会输出enter然后等待五秒左右再输出exit? 因为正如我们说的,

defer后面的函数值和参数会被求值但是实际函数调用却要等到最后

这里函数值就是trace()返回的匿名函数,函数参数当然就是字符串字面值"foo()", 对trace("foo()")的求值会输出function foo() enter, 实际函数调用trace("foo()")()即输出function foo() exit(elapsed x.x)会推迟到return执行后。

杂项

多说一点,如果存在多个defer语句,最后的defer的函数的执行顺序与defer出现的顺序相反,如:

func main() {
	func1 := func(){
		fmt.Println("func1() execution deferred")
	}
	func2 := func(){
		fmt.Println("func2() execution deferred")
	}
	defer func1()
	defer func2()
	fmt.Println("strat
working...")
}
/*
OUTPUT:
strat
working...
func2() execution deferred
func1() execution deferred
*/

  

当前文章:http://fstdn.com/201862894.html

发布时间:2019-02-19 15:16:14

购买棋牌游戏赚钱吗 哪个游戏有炸金花 福州麻将技巧十句口诀 玩什么斗地主赢话费 电玩单机 母婴加盟十大品牌 卧龙熊猫基地 打双扣游戏下载

编辑:龙伯伯

点击获取礼包
山东保皇
沙发
发表于 2019-02-19 13:22:18 | 只看该作者
门外的骑士扈从放些白鸽,再由凯美拉送上鲜花,各国代表涌上去恭贺……仪式总算差不多了!其实还漏了一项,就是贝弗这红衣主教要代表‘神,亲吻一下艾花儿的额头,而艾薇儿这个新上任的女王,还要抱着他的腿表示对神的服从……贝弗可不敢当着雪飞鸿的面前亲吻艾莜儿,那怕是祝福也不行。
回复 支持 反对

使用道具 举报

孕妇打牌手气好
板凳
发表于 2019-02-19 22:42:37 | 只看该作者
“呵呵!”刘皓直直冲到另一个沙之逆罚面前却被一把巨大的土矛个刺穿了,只可惜刺穿的是一个残影留下的只有一声冷笑。http://fstdn.com/list_39157.html
回复 支持 反对

使用道具 举报

大乐透买法预算
地板
发表于 2019-02-19 11:43:48 | 只看该作者
在村雨的刀尖刺在地上直立在地上的同时赤瞳已经走到了刘皓面前,上上下下的打量着刘皓,那样子可谓是专注到极致,甚至刘皓都怀疑她吃东西和暗杀的时候都没有现在这般专注过。
回复 支持 反对

使用道具 举报

九五至尊电玩棋牌游戏
5#
发表于 2019-02-19 15:02:44 | 只看该作者
果然,明珠呆了一下,她的脸蓦地羞得通红,丢下李庆安的手,便向内宅跑去。
回复 支持 反对

使用道具 举报

有人举报过火萤棋牌吗?
6#
发表于 2019-02-19 05:54:49 | 只看该作者
说完,他站起身,嘱咐几名亲兵道:“好好照顾严先生,不得怠慢。”
回复 支持 反对

使用道具 举报

麻将游戏大厅
7#
发表于 2019-02-19 16:47:42 | 只看该作者
突然,唐川想起了一件事,他嘿嘿笑着说道:“叶叔,我能求你帮我一件事么?”
回复 支持 反对

使用道具 举报

糖果派对倍数规则
8#
发表于 2019-02-19 14:20:25 | 只看该作者
也因为如此,猜测史莱克七怪在哪个分斗魂区进行斗魂,也成为了在外围斗魂场的观众们乐此不疲的习惯。
回复 支持 反对

使用道具 举报

试玩棋牌赚钱是真的吗
9#
发表于 2019-02-19 03:17:54 | 只看该作者
不过,也正是那段时间的惨败,成全了他,让他在消沉中,找到了自己的风格,才有了现在的风光。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

一分快3大小单双猜测是互联网最大的搜索引擎优化研究中心,是致力于培养学员用户体验意识和提供专业技术解答的专业培训机构, 成立于2007年,2008年第一家入驻歪歪的培训机构,2014年成为腾讯课堂战略合作机构。
© 2007-2016 一分快3大小单双猜测 湘ICP备13004652号-1 Powered by Discuz!X  Template by 一分快3大小单双猜测 
快速回复 返回顶部 返回列表