关于延期,Effective
Go
声明以下内容:
延迟函数(如果函数是方法,则包括接收方)的参数在 延迟 执行时而不是在 调用
执行时进行评估。除了避免担心函数执行时变量会更改值外,这还意味着单个延迟的调用站点可以延迟多个函数的执行。这是一个愚蠢的例子。for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i) }
延迟函数以LIFO顺序执行,因此该
4 3 2 1 0
函数返回时将导致打印此代码。
这个例子使我感到困惑。如果在执行defer调用时评估了参数,则应该打印for循环中的延迟器,5 5 5 5 5
因为将在for循环结束时调用这些延迟器,届时i
将为5。在for循环结束时评估延迟器将因此,所有通话结果为5。
我在这里想念什么吗?
这似乎是连贯的(另请参阅“ 延迟,恐慌和恢复 ”)
周围函数返回 后, 将按照 后进 先出的顺序执行延迟的函数调用。
该函数打印“ 3210”:
func b() {
for i := 0; i < 4; i++ {
defer fmt.Print(i)
}
}
defer
评估时的最后一次调用意味着i=3
,最后一个意味着最后一个i=2
,依此类推。
Golang规格:
每次
defer
执行“ ”语句时,都会照常评估调用的函数值和参数并重新保存,但实际的函数体不会执行。
在
defers
将被称为FUNC结束时
是的,但是在循环运行时会先评估它们的参数。
当与闭包(函数文字)一起使用时,“
如何golang的“延迟”捕获闭包的参数?”中有一个比较棘手的defer案例,如“为什么在Golang中闭包主体后面添加“”中所详细说明”。()
问题内容: 更改了该方法的结构后,当defer调用两次时会发生什么? 例如: 其中当最后叫什么名字? 问题答案: 它取决于方法的接收者 和 变量的类型。 简短的答案:如果您使用的是包,则延迟的方法将正确关闭两个实例,因为它们具有 指针 接收器, 并且 由于返回了 指针 ( 指针 也是如此)。请参阅下面的推理和解释。 为避免混淆,我建议使用不同的变量,这样会清楚您 想要 什么以及 将要 关闭的内容:
Go 语言中没有提供其它面向对象语言的析构函数,但是 Go 语言提供了 defer 语句用于实现其它面向对象语言析构函数的功能 defer 语句常用于 释放资源、解除锁定 以及 错误处理 等 例如C语言中我们申请了一块内存空间,那么不使用时我们就必须释放这块存储空间 例如C语言中我们打开了一个文件,那么我们不使用时就要关闭这个文件 例如C语言中我们打开了一个数据库, 那么我们不使用时就要关闭这个数
问题内容: 我试图在收到请求后立即发送页面响应,然后进行处理,但是我发现响应即使按代码顺序排列也没有“首先”发送。在现实生活中,我有一个页面可供上传一个Excel工作表,该工作表保存到数据库中需要花费时间(50000+行),并且希望更新用户进度。这是一个简化的示例;(取决于您有多少RAM,您可能需要添加几个零来计数才能看到结果) 问题答案: HTTP协议的原始概念是一个简单的请求- 响应服务器-客
问题内容: 我正在尝试使用新的React Lazy和Suspense创建后备加载组件。这很好用,但后备时间仅显示几毫秒。有没有办法增加额外的延迟或最短时间,因此我可以在渲染下一个组件之前显示该组件的动画? 现在懒导入 等待组件: 我可以做这样的事情吗? 问题答案: 函数应该返回对象的承诺,该对象由具有默认导出功能的模块返回。不会返回承诺,也不能那样使用。尽管任意承诺可以: 如果目标是提供 最小的
问题内容: 我正在阅读有关go语言的延期声明。它允许您指定函数结束后要执行的操作。例如,如果您有文件指针或资源,而不是使用每个可能的返回路径编写自由/删除,则只需指定一次defer函数。 它看起来像一个模拟可能会转到C 最终(什么是C标准延迟/终结执行 ? ,会不会有范围后卫/范围退出成语?标准化在此之前,有什么意外讲的是一个对象,它这样做析构函数进行回调?看起来局部变量的析构函数顺序是理智的,并
问题内容: 运行上面的代码后,未执行,我的意思是文本字段未将其文本设置为“ START”, 为什么? 如何解决呢? 问题答案: 请记住,该按钮在JavaFX线程上被调用,因此您实际上将UI线程暂停了5秒钟。在这五秒钟的末尾取消冻结UI线程时,将同时应用这两个更改,因此最终只能看到第二个。 您可以通过在新线程中运行以上所有代码来解决此问题: