【golang】defer总结

本文详细解析了Go语言中defer语句的使用规则及执行时机,包括defer后的语句必须为函数调用、参数计算时机、以及如何影响函数返回值。通过具体代码示例,帮助读者掌握defer在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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")
}

输出

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值