- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有两个关于golang中defer语句的例子,第一个不正确,第二个正确。但我认为他们有同样的问题,在我看来我认为第二个仍然存在文件描述符用完的风险,任何人都可以帮助我澄清为什么第二个是正确的吗?谢谢!
示例 1:
for _, filename := range filenames {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close() // NOTE: risky; could run out of file descriptors
// ...process f...
}
例子2:
for _, filename := range filenames {
if err := doFile(filename); err != nil {
return err
}
}
func doFile(filename string) error {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close()
// ...process f...
}
最佳答案
延迟函数在封闭函数返回时运行。 Spec: Defer statements:
A "defer" statement invokes a function whose execution is deferred to the moment the surrounding function returns, either because the surrounding function executed a return statement, reached the end of its function body, or because the corresponding goroutine is panicking.
在您的第一个示例中,您使用了一个 for
循环,其中您使用了 defer
语句,但是延迟函数不会在迭代结束时执行,只会在 for
循环之后(当封闭函数结束时)。这意味着您在 for
循环中打开的所有文件都将保持打开状态,直到“结束”。如果 filenames
包含一千个有效文件名,则循环将(尝试)在开始关闭其中任何文件之前打开一千个文件。
在您的第二个示例中,您将文件处理“外包”给了一个单独的函数。在这个函数中使用 defer
是完全不同的,因为当这个函数返回时,延迟函数 (File.Close()
) 将首先被调用。因此,在您的第二个示例中,发布的代码始终打开最多 1 个文件,无论 filenames
包含多少元素。
关于go - 如何理解defer语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46521614/
在 javascript 中使用 defer 属性的正确语法是什么? 我见过有两种方式: 1: ... 2: ... 根据经验 [和我找不到的引用资料],我更倾向于使用第二个选项,但我只是仔细检查了
有什么区别 var dfd = new $.Deferred 和 var dfd = $.Deferred 在哪些情况下需要使用 new 与不使用它? 最佳答案 jQuery official doc
给定使用 Promise 构造函数的代码 let promise = () => new Promise(resolve => resolve(1)); new Promise((resolve, r
我正在研究 RxKotlin,问题出现了:defer() 和 defer{} 有什么区别 最佳答案 defer() 和 defer {} 只是写同一件事的两种方式。 Kotlin 在某些特定情况下允许
我正在尝试使用 Python 在 Google App Engine 上执行此操作: def add_to_db(person): a = PersonDb(key_name = perso
所以我有一个延迟对象数组dataCalls。 目前我正在使用以下方法来解雇所有这些,并在所有 Deferreds 解决后调用回调: $.when.apply(null, dataCalls) .
考虑以下几点: function foo(){ // Returns the jQuery deffered below. var urlToUse; $.ajax({
我刚刚看到此代码已被弃用,我一直在尝试遵循此指南:http://www.codelord.net/2015/09/24/$q-dot-defer-youre-doing-it-wrong/以正确的方式
我有一些元素,其中一些代码依赖于其他 中的代码元素。我看到了defer属性在这里可以派上用场,因为它允许推迟执行代码块。 为了测试它,我在 Chrome 上执行了这个:http://jsfiddle
我需要向 jQuery 的 .when() 监视的函数添加未知数量(仅在运行时已知)的 .pipe() 调用。这些调用将基于另一个异步操作的 ajax 调用。请参阅下面的代码以获得更清晰的解释: $.
我正在使用 GAE 的“deffered” ' 库 (python),它会在出现异常时自动重试任务。 有没有办法知道(在任务处理函数中)任务已尝试的次数? 我的最终目标是实现如下内容: if num_
我有几个 元素,其中一些代码依赖于其他 中的代码元素。我看到了defer属性在这里可以派上用场,因为它允许代码块在执行中被推迟。 为了测试它,我在 Chrome 上执行了这个:http://jsfi
在我看来,两者都做同样的事情。 文档: deferred.always() deferred.then() 最佳答案 看起来deferred.then()允许您传递两个单独的成功和失败回调,而 def
我正在使用 Twisted 编写代码,但在为我的扭曲互联网延迟变量想出一个合理的变量名时遇到了麻烦。这是我的候选人: d :太通用,太短,违反了 pylint 规则 C0103。 def :与内置函数
是否存在这样的情况:调用 .callback() 或 .errback() 会向调用者引发异常,而该异常不会被延迟捕获? 假设我有以下延迟和回调: from twisted.internet impo
这是代码: http://jsbin.com/lizami/edit?js,console 将代码也粘贴到此处: var aaa = $.Deferred(); var bbb = function(
这是我的尝试: deferred.defer(class1().method1, class2.method2, arg) deferred.defer(class1().method1, class
我正在尝试使用 google.appengine.ext.deferred 来运行任务。我正在将一个方法传递给 defer() 方法,该方法成功运行,但在返回时抛出一个 ValueError: F
这个问题在这里已经有了答案: What's the difference between a Deferred object and its own promise object? (3 个答案)
我下载了一个名为 jsdeferred 的库来尝试帮助我解决一些代码流问题,但我有点迷茫,因为它的示例和...“文档” 在某些事情上有点不清楚。但是当我继续阅读和挖掘,当然还有谷歌搜索阳光下的一切时,
我是一名优秀的程序员,十分优秀!