defer、返回值(中文网)——20221128

中文网

func increaseA() int {
	var i int
	defer func() {
		i++
	}()
	return i
}

func increaseB() (r int) {
	defer func() {
		r++
	}()
	return r
}

func main() {
	fmt.Println(increaseA())
	fmt.Println(increaseB())
}

答案

 0 1

解析

  1. go的return有三步
    1. 第一步,赋值:result = 值
    2. 第二步,defer执行
    3. 第三步,return result

所以,defer哪怕改了变量i的值,返回的也是int类型的默认值0

func increaseA() int {
	var i int	     // i=0
	defer func() {
		i++
	}()
	return i		// result = i 即 result = 0
					// i = 1
					// return result
}

验证:

func increaseA() *int {
	var i int
	defer func() {
		i++
	}()
	return &i
}
fmt.Println(*increaseA())
// 1

解读步骤:

  1. result = i的地址
  2. defer将i的值改变为1
  3. return i的地址

外部接受到,取值就会发现改为了1。

对于命名的返回值,相当于已经声明了变量,可看做与形参类似的局部变量,最后由 return 隐式返回。套步骤

func increaseB() (r int) {
	defer func() {
		r++
	}()
	return r			// r = 0
						// r++
						// return
}

同样的例题:命名返回参数可被同名局部变量遮蔽,此时需要显式返回。显式 return 返回前,会先修改命名返回参数。

package main

func add(x, y int) (z int) {
    defer func() {
        println(z) // 输出: 203
    }()

    z = x + y
    return z + 200 // 执行顺序: (z = z + 200) -> (call defer) -> (return)
}

func main() {
    println(add(1, 2)) // 输出: 203
}
//   203
    203

你可能感兴趣的:(GO,java,golang,开发语言)