gpt4 book ai didi

go - 我可以使用指向 "error"的指针来捕获返回错误吗?

转载 作者:数据小太阳 更新时间:2023-10-29 03:43:18 25 4
gpt4 key购买 nike

我正在编写一些事务开始/提交/回滚函数,我想将 block 配对以防止忘记提交

我是这样写的:


func (foo *Foo) Bar() (err error) {

foo.Begin()
defer foo.End(&err)

//some business code

return
}

func (foo *Foo) End(eptr *error) {
// if recover
if r := recover(); r != nil {
debug.PrintStack()
*eptr = r.(error)
}

var err = *eptr
if err != nil {
foo.Rollback()
} else {
foo.Commit()
}
}

它有效,但它使用“接口(interface)指针”,我找不到关于接口(interface)指针的规范。

所以,我不确定这段代码是否足够好。你能给点建议吗?


感谢 teyzer 和 Corey Ogburn,这是我的固定解决方案:


func (foo *Foo) Bar() (err error) {

foo.Begin()
defer func() { foo.End(err) }()
defer func() {
if r := recover(); r != nil {
debug.PrintStack()
err = makeError(r)
}
} ()

//some business code

return
}

func (foo *Foo) End(err error) {
if err != nil {
foo.Rollback()
} else {
foo.Commit()
}
}

最佳答案

当达到 defer 时,延迟函数的参数会立即被评估。这就是为什么如果您延迟 End 本身,则必须使用指针。

相反,您可以使用闭包。您的 Bar() 函数如下所示:


func (foo *Foo) Bar() (err error) {
foo.Begin()
defer func() { foo.End(err) }()
//some business code
return
}

一旦执行了延迟闭包,就会计算 err 的值。

如果您不坚持使用错误返回,使用 panic 和 recover 是 Go 中处理此类需要回滚的错误的更惯用的方法(如 Corey Ogburn 推荐的)。

关于go - 我可以使用指向 "error"的指针来捕获返回错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56382595/

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