作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我们可以轻松地将一个函数作为参数传递并与defer
一起使用:
func main() {
test(rec)
}
func test(f func(int)) {
defer f(10)
panic("test")
}
func rec(v int) {
e := recover()
fmt.Println(e)
fmt.Println(v)
}
这行得通。 Playground .
但是如果我们需要传递一个方法然后在该方法中调用recover
怎么办?
type MyStruct struct {
Data string
}
func main() {
a := &MyStruct{}
test(a.Recover)
}
func test(f func(int)) {
defer f(10)
panic("test")
}
func (m *MyStruct) Recover(arg int) {
e := recover()
fmt.Println(e)
fmt.Println(arg)
}
这里我们得到一些奇怪的行为,我不完全理解。 Playground .
似乎该方法被调用了,但是 recover
返回了 nil
,之后出现了(另一个?) panic 。 golang 文档和谷歌结果都没有帮助我理解这种行为的原因。我错过了什么?
最佳答案
recover()
函数 returns nil when not called directly from the deferred function .
通过 method value 调用a.Recover
不是直接调用。
使用调用 recover 和方法的包装函数:
func main() {
a := &MyStruct{}
test(func(arg int) { a.Recover(arg, recover()) })
}
func test(f func(int)) {
defer f(10)
panic("test")
}
func (m *MyStruct) Recover(arg int, e interface{}) {
fmt.Println(e)
fmt.Println(arg)
}
另一种选择是使用 method expression ,但这可能偏离了您要完成的目标:
func main() {
a := &MyStruct{}
test(a, (*MyStruct).Recover)
}
func test(a *MyStruct, f func(*MyStruct, int)) {
defer f(a, 10)
panic("test")
}
func (m *MyStruct) Recover(arg int) {
e := recover()
fmt.Println(e)
fmt.Println(arg)
}
关于go - 将要与 defer 一起使用的方法作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48000276/
我正在研究 iOS 控件委托(delegate)的命名约定。我熟悉 should, will, did pattern for delegate methods .我可以看到这种命名约定被 Apple
我是一名优秀的程序员,十分优秀!