go defer 关键字的需要注意的问题

一:

go defer 声明的代码在goroutine 没有执行:

package main

import (
	"fmt"
	"time"
)
var ch chan  int
func main() {

	ch =make(chan  int)
	for i:=0;i<10 ;i++  {
		go test(i)
	}

	for i:=0;i<10 ;i++  {
		<-ch
	}
	
}
func test(index int ){
	time.Sleep(time.Second*1)
	defer fmt.Println("退出test ",index)
	ch<-index
}

运行结果:

结果一:退出test  5

结果二:什么都没有

不是说好的defer 关键字 的意思是总会执行的吗?结果是defer 关键字并没有执行。

分析:当goroutine的主线程结束,goroutine 的子线程也会结束,剩下的无论什么的代码都不会执行。因为子线程已经结束。

即使是子线程的defer 关键字的代码也不一定会执行。

二:defer 关键字的执行顺序

package main

import (
	"fmt"
)

func main() {
	defer_call()
}

func defer_call() {
	defer func() { fmt.Println("1") }()
	defer func() { fmt.Println("2") }()
	defer func() { fmt.Println("3") }()
}

执行结果:

3 2

1

说明defer 关键字的执行顺序是后进先出 。平常写代码的时候应该注意defer 关键字的执行顺序。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老马寒门IT

09-移动端开发教程-Sass入门

1. 引言 CSS3之前的CSS都大都是枚举属性样式,而编程语言强大的变量、函数、循环、分支等功能基本都不能在CSS中使用,让CSS的编程黯淡无光,Sass就是...

30460
来自专栏互联网杂技

jQuery插件编写步骤详解

本文实例讲述了jQuery插件编写步骤。分享给大家供大家参考,具体如下: 如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jq...

482110
来自专栏前端杂货铺

jQuery的事件模型

前几天自己着重读了jQuery1.11.1的源码,又结合了之前对DE事件模型的分析,最后也实现一个简陋的事件模型。 jQuery的事件系统离不开jQuery的缓...

37080
来自专栏HTML5学堂

JavaScript 基础语法

讲法声明 - 很重要,请先查看 关于JavaScript的讲法,我们采取的方式与HTML&CSS类似,先在课程中带大家,以“实现页面小功能”为目的,一步一步的进...

36340
来自专栏禁心尽力

mybatis_常用标签

1、<where></where>标签的作用 可以动态的添加where关键字 可以自动去掉第一个拼接条件的and关键字 1      <wher...

26770
来自专栏大内老A

ASP.NET MVC的Model元数据与Model模板:预定义模板

通过ModelMetadata表示的Model元数据的一个主要的作用在于为定义在HtmlHelper和HtmlHelper<TModel>中的模板方法(这些模板...

269100
来自专栏Theo Tsao

Vim的基本使用(一)

本文包含Vim的基本使用有: 移动光标、屏幕滚动、模式查找、位置标记、删除文本、撤销与重做、插入文本、复制与移动、修改文本、写入与退出。

10930
来自专栏数据结构笔记

python爬虫系列之 xpath:html解析神器

通过前面的文章,我们已经知道了如何获取网页和下载文件,但是前面我们获取的网页都是未经处理的,冗余的信息太多,无法进行分析和利用

40530
来自专栏超然的博客

让js调试更简单—console

console上述的集中度支持printf的占位符格式,支持的占位符有:字符(%s)、整数(%d或%i)、浮点数(%f)和对象(%o):

14510
来自专栏Hongten

Javascript 笔记

JavaScript表单验证电话号码,判断一个输入量是否为电话号码,通过正则表达式实现。 //检查电话号码 function isTel(str){      ...

12010

扫码关注云+社区

领取腾讯云代金券