版权声明:本文为博主原创文章,未经博主允许不得转载。 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")
}
输出