看看下面几个函数返回结果都是什么:
package main
import "fmt"
func f0() (int) {
var r int
defer func() {
r++
}()
return r
}
func f1() (r int) {
defer func() {
r++
}()
return 0
}
func f2() (r int) {
t := 5
defer func() {
t = t + 5
// fmt.Println("r is:",r) // 5
}()
return t
}
func f3() (r int) {
defer func(r int) {
r = r + 5
}(r)
return 1
}
func f4() (*int) {
var r int
defer func() {
r = r + 5
}()
return &r
}
func main() {
fmt.Println("f0 return:",f0())
fmt.Println("f1 return:",f1())
fmt.Println("f2 return:",f2())
fmt.Println("f3 return:",f3())
fmt.Println("f4 return:",*f4())
}

返回步骤:
1.多个defer的执行顺序为“后进先出”;
2.defer、return、返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入返回值中;接着defer开始执行一些收尾工作;最后函数携带当前返回值退出。
相信看到f4()的时候就应该明白返回值的关注点在哪里了,函数在返回的时候是先在栈空间上写入返回值(return),修改的时候需要关注修改的是不是这个返回值,还是说是修改了副本。另外,不要没事返回指针回去

479

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



