由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 发现一个Go的大坑,传给defer的参数不取运行时的值
相关主题
go里面channel和wait group用法比较inline functions in C++
请教template和factory有啥区别?Java有closure吗?
python下的expect__FUNCTION__ 是怎么回事呀?
python 的deferred module??? i m confused
C一个问题搞不懂c++ typedef 一问
GO 语言里的 defer 思路是什么?Call assembly in c++ under linux
问一个WPF的问题which func will be called?
Daemon thread[合集] 为什么不能: declare a static memeber func
相关话题的讨论汇总
话题: addsample话题: samples话题: defer话题: func话题: evaluated
进入Programming版参与讨论
1 (共1页)
f*******t
发帖数: 7549
1
package main
import (
"fmt"
)
func compute(addSample func(int)) {
addSample(1)
addSample(2)
}
func main() {
var samples []int
addSample := func(n int) {
samples = append(samples, n)
}
defer fmt.Println(len(samples), "samples are added. expecting 2")
compute(addSample)
}
实际输出是
0 samples are added. expecting 2
文档解释:
A deferred function's arguments are evaluated when the defer statement is
evaluated.
所以千万别把defer当closure用,否则有可能出难以解释的bug
W********u
发帖数: 58
2
这只能说明你看文档太不仔细了,这说得很清楚啊,还有例子呢:
http://blog.golang.org/defer-panic-and-recover
1. A deferred function's arguments are evaluated when the defer statement is
evaluated.
In this example, the expression "i" is evaluated when the Println call is
deferred. The deferred call will print "0" after the function returns.
func a() {
i := 0
defer fmt.Println(i)
i++
return
}
d****n
发帖数: 1637
3
function closure

【在 f*******t 的大作中提到】
: package main
: import (
: "fmt"
: )
: func compute(addSample func(int)) {
: addSample(1)
: addSample(2)
: }
: func main() {
: var samples []int

1 (共1页)
进入Programming版参与讨论
相关主题
[合集] 为什么不能: declare a static memeber funcC一个问题搞不懂
一个简单的算法问题?GO 语言里的 defer 思路是什么?
template metaprogramming 的问题问一个WPF的问题
关于STDERR定向到文件问题Daemon thread
go里面channel和wait group用法比较inline functions in C++
请教template和factory有啥区别?Java有closure吗?
python下的expect__FUNCTION__ 是怎么回事呀?
python 的deferred module??? i m confused
相关话题的讨论汇总
话题: addsample话题: samples话题: defer话题: func话题: evaluated