gpt4 book ai didi

go - 将要与 defer 一起使用的方法作为参数传递

转载 作者:IT王子 更新时间:2023-10-29 01:04:35 25 4
gpt4 key购买 nike

我们可以轻松地将一个函数作为参数传递并与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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com