- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
以下 Go 代码演示了 defer 和 go 闭包之间闭包捕获规则的区别。在教程中,有人告诉我 for 循环变量的范围仅限于循环体,但这里似乎有所不同。
package main
import "fmt"
func deferred() {
for i := 0; i < 5; i++ {
defer fmt.Println(i)
}
}
func cps() {
clo := new(func())
*clo = func() {}
defer func() { (*clo)() }()
for i := 0; i < 5; i++ {
oldClo := *clo
*clo = func() {
fmt.Println(i)
oldClo()
}
}
}
func cpsCpy() {
clo := new(func())
*clo = func() {}
defer func() { (*clo)() }()
for i := 0; i < 5; i++ {
oldClo := *clo
cpy := i
*clo = func() {
fmt.Println(cpy)
oldClo()
}
}
}
func main() {
fmt.Println("defer")
deferred()
fmt.Println("cps")
cps()
fmt.Println("cpsCpy")
cpsCpy()
}
这会产生输出:
defer
4
3
2
1
0
cps
5
5
5
5
5
cpsCpy
4
3
2
1
0
如果差异是有意为之,那么可以证明差异的不同用例是什么?
最佳答案
spec for defer对此很清楚。一般来说,规范对于任何关心变量捕获规则之类的东西的人来说都是至关重要的阅读,而且它的内容相对较短。这里说的是:
Each time a "defer" statement executes, the function value and parameters to the call are evaluated as usual and saved anew but the actual function is not invoked.
the blog post on defer, panic, and recover 中也有介绍.
总是很难证明每个人都满意的设计决策,而 defer
有时确实会让人们感到惊讶,特别是当您执行 defer f1(f2(x))
而忘记 f2(x)
将立即被评估。
但有一件事可能有助于记住它,即 defer
(或 go
)之后发生的是函数调用,并且只是函数调用本身(甚至不是参数的评估)会及时移动。闭包定义了一个代码块,并且在执行代码时访问变量。
由于您对使用闭包获得的变量捕获类型感到好奇,如果您使用闭包和类似 ForEach
的方法,那么它的一个有用的例子是:
myBTree.ForEach(func (key, value []byte) {
//...
})
如果像在常规 for
循环中一样,大括号之间的代码可以修改外部作用域中的变量,那就太好了。这要求闭包访问变量,而不仅仅是它们在特定时间的值。
关于go - Go 闭包捕获规则与 defer 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39537522/
在 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 的库来尝试帮助我解决一些代码流问题,但我有点迷茫,因为它的示例和...“文档” 在某些事情上有点不清楚。但是当我继续阅读和挖掘,当然还有谷歌搜索阳光下的一切时,
我是一名优秀的程序员,十分优秀!