Go的两阶段延迟执行

Go 的 defer 不仅仅是用于清理任务,还可以用于准备任务,考虑以下示例:

func setupTeardown() func() {
   
    fmt.Println("Run initialization")
    return func() {
   
        fmt.Println("Run cleanup")
    }
}

func main() {
   
    defer setupTeardown()() // <--------
    fmt.Println("Main function called")
}

// 输出:
// Run initialization
// Main function called
// Run cleanup


这种模式的美妙之处在于,只需一行代码,你就可以完成诸如以下任务:

  • 打开数据库连接,然后关闭它。
  • 设置模拟环境,然后拆除它。
  • 获取分布式锁,然后释放它。

  • “嗯,这似乎很聪明,但它在现实中有什么用处呢?”

还记得追踪执行时间的技巧吗?我们也可以这样做:

func TrackTime() func() {
   
  pre := time.Now()
  return func() {
   
    elapsed := time.Since(pre)
    fmt.Println("elapsed:", elapsed)
  }
}

func main() {
   
  defer TrackTime()()

  time.Sleep(500 * time.Millisecond)
}

注意!如果我连接到数据库时出现错误怎么办?

确实,像defer TrackTime()defer ConnectDB()这样的模式不会妥善处理错误。这种技巧最适合用于测试或者当你愿意冒着致命错误的风险时使用,参考下面这种面向测试的方法:

func TestSomething(t *testing.T) {
   
  defer handleDBConnection(t)()
  // ...
}

func handleDBConnection(t *testing.T) func() {
   
  conn, err := connectDB()
  if err != nil {
   
    t.Fatal(err)
  }

  return func() {
   
    fmt.Println("Closing connection", conn)
  }
}

这样,在测试期间可以处理数据库连接的错误。

相关推荐

  1. Go阶段延迟执行

    2024-02-03 06:02:01       29 阅读
  2. go延迟执行和定时器实现

    2024-02-03 06:02:01       34 阅读
  3. Flink阶段提交是什么

    2024-02-03 06:02:01       30 阅读
  4. Go 延迟调用机制

    2024-02-03 06:02:01       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-03 06:02:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-03 06:02:01       18 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-03 06:02:01       17 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-03 06:02:01       20 阅读

热门阅读

  1. 【精华文章】戊子仲秋的算法学习笔记汇总

    2024-02-03 06:02:01       35 阅读
  2. 【精华文章】戊子仲秋的编程学习笔记汇总

    2024-02-03 06:02:01       37 阅读
  3. leetcode - 1004. Max Consecutive Ones III

    2024-02-03 06:02:01       27 阅读
  4. Android 8.1 设置--声音中增加通话音量

    2024-02-03 06:02:01       29 阅读
  5. 计算机网络(第六版)复习提纲15

    2024-02-03 06:02:01       26 阅读
  6. ++i(前置自增)和 i++(后置自增)的区别

    2024-02-03 06:02:01       25 阅读
  7. 【前端插件工具】

    2024-02-03 06:02:01       30 阅读
  8. Vue.js 中父组件调用子组件的方法

    2024-02-03 06:02:01       35 阅读
  9. pip安装tf-gpu=2.4的bug解决方案

    2024-02-03 06:02:01       36 阅读
  10. wpf 消息传递

    2024-02-03 06:02:01       29 阅读
  11. Ubuntu 22.04 配置qtchooser默认启用 Qt6

    2024-02-03 06:02:01       32 阅读