要点
1.defer函数的入参值,在出现的时候就确定
2.return不是原子操作,而是先赋值,再return
3.多个defer,采用队列方式执行.
第三点不难理解.下面用两个例子来说明前面两点.
func test01() {
age := 1
defer fmt.Println(age)
age = 4
}
func test02() {
age := 1
defer func() {
fmt.Println(age)
}()
age = 4
}
func test03() {
age := 1
defer func(age int) {
fmt.Println(age)
}(age)
age = 4
}
打印结果
1打印1
2打印4
3打印1
初学go的时候有疑问,为啥test1打印1,符合defer的入参在defer出现的时候赋值,
为啥test2就不是了呢? 因为test2里函数执行的时候,这个age的变量就是外面的变量呀. test1的传参是age的值的拷贝. test3应该可以懂的,只不过test3是匿名函数写法.
/**
相当于
age=1
age++
return
所以返回2
**/
func test31() (age int) {
age = 1
defer func() {
age++
}()
return age
}
/**
相当于
age=1
age=4
返回值=age 注意这里是具名返回值和非具名返回值的区别
age++
return
所以返回4
**/
func test32() int {
age := 1
defer func() {
age++
}()
age = 4
return age
}
/**
相当于
age=1
defer 这里的age++是age的拷贝+1,和原来的age没有任何关系
return
返回1
**/
func test33() (age int) {
age = 1
defer func(age int) {
age++
}(age)
return age
}
/**
age2=1
age=age2
age++
return
所以返回了2
**/
func test34() (age int) {
age2 := 1
defer func() {
age++
}()
return age2
}
return是非原子操作.要拆解成两步来理解,且具名返回值和非具名返回值也要区别看.
1956

被折叠的 条评论
为什么被折叠?



