golang defer粗解

php转golang中,对defer关键字写一下初步的心得php

defer特性:golang

  • defer是本身最早入栈,而后将其位置以后的函数压入栈,等return或者panic之后,按照先进后出的原则本身最后执行,达到目的

  • defer的函数的参数在执行defer函数时计算,defer函数的变量的值在执行时计算.执行的时候是多少,就将对应值带入

代码放上来(defer的三个不一样位置以及不一样的函数返回的值也不一样)数据库

package main

import "fmt"

func main() {
	println(DeferFunc1(1))
	println(DeferFunc2(1))
	println(DeferFunc3(1))
}

func DeferFunc1(i int) (t int) {
	t = i  
	fmt.Println("t1",t);
	defer func() {
		fmt.Println("t3",t);
		t += 3
		fmt.Println("t4",t);
	}()
	fmt.Println("t2",t);
	return
}

func DeferFunc2(i int) int {
	t := i
	fmt.Println("t5",t);
	defer func() {
		fmt.Println("t7",t);
		t += 3
		fmt.Println("t8",t);
	}()
	fmt.Println("t6",t);
	return t
}

func DeferFunc3(i int) (t int) {
	fmt.Println("t9",t);
	defer func() {
		fmt.Println("t11",t);
		t += i
		fmt.Println("t12",t);
	}()
	fmt.Println("t10",t);
	return 2
}
复制代码

先放出来结果bash

由于结果很长,一次性输出三个函数的值,因此横向摆放,看起来能简单一些

函数输出结果

第一个函数

1.该函数初始化时定义了返回参数的名字t 而且定义了返回的类型 t的初始值是0 且t的做用域为整个函数(划重点)
2.该函数执行时 t被赋值为1 因此t1打印出来为1
3.return的时候t的值依旧是1 且return后执行了defer t3位置接受到的t值为1 也是毫无疑问的
4.t3位置后,t+3=4,由于!由于t的做用域是整个函数,因此t=4之后t的值被保留,故第一个函数返回的值是4

第二个函数

1.该函数只定义的返回的值,只要是该类型的变量就能够
2.t初始化为i,因为t是在函数内部定义,因此t的做用域是该函数内
3.return的时候t的值依旧是1
4.t7的时候接收到了t的值为1,t以后+3=4,t8接收也是4,可是在返回的时候因为t的做用域只是该函数内,因此返回的t的值并无被defer内的操做替换,依旧是1

第三个函数

认真看了前两个的解析的同窗应该第三个很好理解了
1.是定义了个做用域整个函数的返回值t
2.返回t的值为2
3.defer接收到返回值t为2 并加了i的值为3
4.因为t的做用域为整个函数,因此返回t的值为3

总结:若是defer要返回某些参数的值,而不是普通的关闭数据库链接等等,那么要选择好对应参数的做用域,做用域不一样结果也是截然不同函数

(over. 若有不一样意见欢迎文明交流,但愿各位大佬给出指点意见)ui

相关文章
相关标签/搜索