首页 > 其他分享 >18、defer

18、defer

时间:2023-05-11 22:56:27浏览次数:25  
标签:defer 函数 18 fmt Println 执行 延迟

1.defer是什么?

字面意思来看,defer是延迟,推迟的意思
在go语言中,使用defer关键字来延迟一个函数或者方法的执行

2.defer能干嘛?

  • 对象.close(),临时文件的删除
    文件.open()
    defer close()
    读或写

  • go语言中关于异常的处理,使用panic()和recover()
    panic()函数用于引发恐慌,导致程序中断执行
    recover()函数用户恢复程序的执行,recover()语法上要求必须在defer中执行

注意:荡有多个defer修饰的函数时,遵循先进后出的规则;类似于栈的结构

3.defer在函数传递传递参数的时候

defer函数调用时,就已经传递了参数数据了,只是暂时不执行函数中的代码而已

4.defer函数的注意点

defer函数:
当外围函数中的语句正常执行完毕时,只有其中所有的延迟函数都执行完毕,外围函数才会真正的结束执行。
当执行外围函数中的return语句时,只有其中所有的延迟函数都执行完毕后,外围函数才会真正返回当外围函数中的代码引发运行恐慌时,只有其中所有的延迟函数都执行完毕后,该运行时恐慌才会真正被扩展至调用函数。

/**
 * @author ly (个人博客:https://www.cnblogs.com/qbbit)
 * @date 2023/5/11  22:34
 * @tags 喜欢就去努力的争取
 */
package main

import "fmt"

func main() {

	// defer
	defer funDefer("hello")
	fmt.Println("111111")
	defer funDefer("world") // 被延迟了,在外层函数执行完,才来执行
	fmt.Println("ly~~~~")

	fmt.Println("=================")

	a := 2
	fmt.Println("defer之前:", a)
	defer funDefer2(a)
	a++
	fmt.Println("defer之后:", a)

	fmt.Println("=================")

	fmt.Println(funDefer3())

}

func funDefer3() int {
	fmt.Println("funDefer3")
	defer funDefer2(100)
	return 1
}

func funDefer2(a int) {
	fmt.Println("funDefer2:", a)
}

func funDefer(s string) {
	fmt.Println(s)
}

image

标签:defer,函数,18,fmt,Println,执行,延迟
From: https://www.cnblogs.com/qbbit/p/17392493.html

相关文章

  • [NOIP2018 普及组] 标题统计
    [NOIP2018普及组]标题统计题目描述凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符?注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。输入格式输入文件只有一行,一个字符串\(s\)。输出格式输出文件只有......
  • 18
     #include<iostream>#include<cmath>usingnamespacestd;intmain(){ doublem; for(inti=1;i<=64;i++) { inta; a=i-1; m=m+pow(2,a); } cout<<m<<endl; return0;} ......
  • SpringMVC18_文件上传6
    十四、文件上传-客户端表单实现三要素文件上传客户端表单需要满足:表单项type=“file”表单的提交方式是post表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data”form.xml<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html......
  • 18th
    #include<iostream>usingnamespacestd;intmain(){ //对称数对数字分解问题 //一般都要进行对数的取余然后将数字存起来方便比较 intx=95859;//初始里程表求两个小时后另一个对称数 inta[5]; for(inti=95860;;i++){ intp=i; for(intj=0;j<=4;j++){ a[j]=p%......
  • SpringMVC18_SpringMVC获得请求数据5
    一、获得请求参数-请求参数类型 二、获得请求参数-获得基本类型参数  三、获得请求参数-获得POJO类型参数 四、获得请求参数-获得数组类型参数1  五、获得请求参数-获得集合类型参数2  六、获得请求参数-获得集合类型参数3  七、获得请求参数-静态资源......
  • CF1817D Half-sum
    前言前几天@adamant在CF上发表文章介绍了AntonTrygub发明的维护大数的算法TheTrygubNumbers。简要地讲,这个算法支持维护一个\(n\)位\(b\)进制数:给定\(i,v\),将数加上\(vb^i\)。给定\(i\),查询数的第\(i\)位的值。查询数的正负。其主要思想是将平常每位只......
  • SpringMVC18_SpringMVC的数据响应4
    一、SpringMVC的数据响应方式1) 页面跳转直接返回字符串通过ModelAndView对象返回 2)回写数据直接返回字符串返回对象或集合二、页面跳转-返回字符串形式直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转重定向不......
  • Spring18_SpringMVC的组件解析3
    一、SpringMVC的执行流程1. 用户发送请求至前端控制器DispatcherServlet。2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。3.处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给Dis......
  • C#设计模式18——迭代器模式的写法
    是什么:迭代器模式是一种行为型设计模式,它允许客户端通过一种统一的方式遍历集合对象中的元素,而无需暴露集合对象的内部结构。为什么:使用迭代器模式可以使得客户端程序与集合对象解耦,从而可以更加灵活地对集合对象进行遍历操作。此外,迭代器模式还可以提高代码的复用性,简化客户端......
  • CF1825D1 题解
    一、题目描述:给定$n$和$k$,表示有$n$个点,其中有$k$个点是关键点,这$k$个点随机分布。给出$n$个点的连接方式,保证构成一棵树,求有期望多少个点使得这个点到$k$个关键点的距离之和最小,答案对$1e9+7$取模。数据范围:$1\leqn\leq2e5,1\leqk\leqmin(n,3)......