Go 将要与defer一起使用的方法作为参数传递
我们可以轻松地将函数作为参数传递,并将其与Go 将要与defer一起使用的方法作为参数传递,go,error-handling,Go,Error Handling,我们可以轻松地将函数作为参数传递,并将其与延迟一起使用: 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) } 这很有效 但是,如果我们需要传递一个方法,然后在该方法中调用恢复,该怎么办 type MyStru
延迟
一起使用:
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)
}
这很有效
但是,如果我们需要传递一个方法,然后在该方法中调用
恢复
,该怎么办
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)
}
在这里我们得到一些奇怪的行为,我不完全理解
似乎调用了该方法,但recover
返回nil
,然后出现(另一个?)恐慌。golang文档和谷歌搜索结果都没有帮助我理解这种行为的原因。我缺少什么?函数recover()
通过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)
}
另一种选择是使用,但这可能偏离了您试图实现的目标:
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)
}
从文档中不清楚通过方法值调用不是直接调用,但现在我明白了。。。谢谢你的澄清!我是否正确理解在传入参数中无法区分方法值和方法表达式?您(或任何人)知道为什么通过方法值的调用不被视为直接调用吗?方法值的参数数比基础方法的参数数少一个。由此可知,对方法值的调用不是对方法的直接调用。在运行时给定一个函数,无法确定该函数是普通函数、函数文本、方法表达式还是方法值。