当前位置: 首页 > 知识库问答 >
问题:

Defer不仅用于清理-好的还是坏的练习?

萧成文
2023-03-14

在Go博客页面上,我们可以发现“Defer语句将函数调用推送到列表中。保存的调用列表在周围函数返回后执行。Defer通常用于简化执行各种清理操作的函数。”

他们确实提到了清理,但没有提到常规代码执行。显然,它可以执行任意代码,而不必进行清理。不过,这是最好的做法吗?共同体是否就这方面的公约或最佳做法达成任何协议?

共有1个答案

潘楚
2023-03-14

Go编译器不知道什么代码是清理代码。因此,如果它可以推迟清理代码,那么它显然也可以推迟任何非清理代码。

延迟函数有一些开销,显然必须管理调用堆栈,但如果它使代码更安全和/或更容易阅读,那么就去做吧。在返回之前使用它执行任何操作,甚至修改被返回的值,甚至在panicing的情况下,都是非常好的。查看如何在Go函数中返回一个panics值?

您应该记住一件事:即使代码恐慌(这是清除代码所希望的),也要运行延迟函数,否则这将不是正常的执行流。因此,与不使用defer相比,使用defer时这将是一个不同。参见相关内容:循环中的“延迟”--什么会更好?

 类似资料:
  • 问题内容: 我习惯在所有程序中广泛使用 静态变量 ,尤其是在使用Android时。我倾向于使用它们,因为有时 通过Intents发送10个或更多的值 会很 麻烦 。因此,我只是将 它们声明为静态 变量,并通过使用“点”运算符轻松地在其他类中访问它们。使用静态变量的另一个原因是当我要在整个应用程序中使用 Utility类时 。就像我在下面给出的代码一样,它可以帮助我 在不同的活动中使用变量 。 Ut

  • 问题内容: 我正在开发一个显示图像并播放数据库声音的应用程序。我正在尝试确定是否使用单独的JFrame从GUI向数据库添加图像。 我只是想知道使用多个JFrame窗口是否是一种好习惯? 问题答案: 我只是想知道使用多个JFrames是否是一种好习惯? 坏习惯(坏习惯)。 用户不友好:用户只希望看到一个图标时,会在任务栏中看到多个图标。加上编码问题的副作用。 * 编写和维护代码的噩梦: * 一个模态

  • 问题内容: 在Python中,假设我有一些从Shape继承的类Circle。形状需要x和y坐标,此外,圆需要半径。我希望能够通过执行以下操作来初始化Circle, Circle继承自shape,因此我需要对使用命名参数,因为不同的类需要不同的构造函数。我可以手动设置x,y和r。 或者,我可以使用以下方式自动设置“圈子”的属性 这样做的好处是代码更少,并且我不需要维护样板。缺点是,Circle需要哪

  • 问题内容: 我们计划使用触发器和需要审计的每个表的单独历史表在数据库中引入简单的审计跟踪。 例如考虑表StudentScore,它只有很少的外键(例如StudentID,CourseID)将其链接到相应的父表(Student&Course)。 如果StudentScore需要审核,我们计划创建审核表StudentScoreHistory- 如果修改了StudentScore中的任何行,我们会将旧行

  • 问题内容: 我在Linux(CentOS 5.3)上有一个C ++程序,它产生多个线程,这些线程处于无限循环中,以执行工作并在特定的时间内hibernate。现在,我必须取消正在运行的线程,以防出现新的配置通知并重新启动新的线程集,为此我使用了pthread_cancel。我观察到的是,即使收到取消指示,线程也不会停止,甚至在完成睡眠后也会出现一些睡眠线程。 由于不希望出现这种行为,因此在上述情况

  • 问题内容: 此处通常建议添加索引,以解决性能问题。 (我只在说阅读和查询,我们都知道索引会使写入变慢)。 多年来,我已经在DB2和MSSQL上尝试了很多方法,结果总是令人失望。 我的发现是,无论索引有多“明显”,它都会使事情变得更好。事实证明,查询优化器更智能,而我的明智选择的索引几乎总是使事情变得更糟。 我应该指出,我的经验主要与小型表(<100‘000行)有关。 谁能提供一些切实可行的索引选择