传递一个与defer一起使用的方法作为参数

时间:2017-12-28 00:43:06

标签: go error-handling

我们可以轻松地将函数作为参数传递,并将其与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,之后又出现了(另一个?)恐慌。 Golang文档和谷歌搜索结果都没有帮助我理解这种行为的原因。我错过了什么?

1 个答案:

答案 0 :(得分:3)

<form [formGroup]="showClassGrp" (ngSubmit)="onSubmit()"> <mat-checkbox id="amateur" class="amateur" color="primary" formControlName="amateur">Amateur</mat-checkbox> <button class="btn btn-primary" type="submit"> Submit </button> </form> 函数returns nil when not called directly from the deferred function

通过method value recover()拨打电话不是直接电话。

使用调用recover和方法的包装函数:

a.Recover

另一种选择是使用method expression,但这可能与你想要完成的事情有所不同:

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