【Go常见错误】8. 关于defer的参数和接受者的取值

本文详细探讨了Go语言中defer语句在处理参数和接收者取值时的行为。讲解了参数是何时取值的,以及如何通过使用指针或闭包来解决延迟获取最新值的问题。通过案例分析了值接收器和指针接收器在defer中的不同表现,并给出了相应的解决方法。
摘要由CSDN通过智能技术生成

前言

defer语句是在其所在函数返回后才被执行的。

然而,如果一个defer函数带有参数,那么这些参数是如何被取值的呢?

defer带参数取值-案例

下面的代码中为避免重复调用logStatus和incrementStatusCounter,我们会使用defer关键词:

type Status int ①

const (
  StatusSuccess Status = iota
  StatusRadiusFilterError
  StatusActivityFilterError
)

func SearchDrivers(drivers []Driver) ([]Driver, error) {
  var status Status
  defer logStatus(status) ②
  defer incrementStatusCounter(status) ③

  var err error
  drivers, err = applyRadiusFilter(drivers)
  if err != nil {
    status = StatusRadiusFilterError ④
    return nil, err
  }

  drivers, err = applyActivityFilter(drivers)
  if err != nil {
    status = StatusActivityFilterError ⑤
    return nil, err
  }

  status = StatusSuccess ⑥
  return drivers, nil
}

① 定义一个Status类型枚举

② 延迟调用logStatus函数

③ 延迟调用 incrementStatusCounter函数

④ 设置status值为半径过滤错误</

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值