Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 将要与defer一起使用的方法作为参数传递_Go_Error Handling - Fatal编程技术网

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)
}

从文档中不清楚通过方法值调用不是直接调用,但现在我明白了。。。谢谢你的澄清!我是否正确理解在传入参数中无法区分方法值和方法表达式?您(或任何人)知道为什么通过方法值的调用不被视为直接调用吗?方法值的参数数比基础方法的参数数少一个。由此可知,对方法值的调用不是对方法的直接调用。在运行时给定一个函数,无法确定该函数是普通函数、函数文本、方法表达式还是方法值。