【golang】defer总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/idwtwt/article/details/87880957

1 defer后面必须是函数调用语句,不能是其他语句,否则编译器会出错

package main

import "log"

func foo(n int) int {
    defer n++
    //defer log.Println("n=", n)
    return n
}

func main() {
    var i int = 100
    foo(i)
}

2 defer函数的参数(包括接受者)是在defer语句出现的位置做计算的,而不是在函数运行的时候做计算的

例子1:

package main

import "log"

func foo(n int) int {
    log.Println("n1=", n)
    defer log.Println("n=", n)
    n += 100
    log.Println("n2=", n)
    return n
}

func main() {
    var i int = 100
    foo(i)
}

输出

例子2

package main
import(
	"fmt"
)
type Slice []int

func NewSlice() Slice {

  return make(Slice, 0)

}

func (s* Slice) Add(elem int) *Slice {

 	*s = append(*s, elem)

	fmt.Print(elem)

 	return s

}

func main() {

	s := NewSlice()

	defer s.Add(1).Add(2)
	s.Add(3)
}

输出

3 defer 函数调用的执行时机是外层函数设置返回值之后, 并且在即将返回之前

函数返回的过程是这样子的:先给返回值赋值,然后调用defer表达式,最后才是返回到调用函数中。

defer表达式可能会在设置函数返回值之后,在返回到调用函数之前,修改返回值,使最终的函数返回值与你想象的不一致。

package main
import(
	"fmt"
)
func f()(result int){
	result = 0
	func(){
		result++
	}()
	return
}


func main() {

	res := f()
	fmt.Print(res,"\n")
}

输出

猜你喜欢

转载自blog.csdn.net/idwtwt/article/details/87880957