gpt4 book ai didi

go - 一种不使用最新的err值写长延迟的方法?

转载 作者:行者123 更新时间:2023-12-03 10:09:02 25 4
gpt4 key购买 nike

我有此代码的作品。

func (r *repoPG) WithTransaction(txFunc func() error) (err error) {
tx := db.NewTx()

defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("panic: %v", r)
tx.Rollback()
} else if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()

err = txFunc()
return
}
我想每次都写长长的 defer,所以我想写这样的func:
func TxDefer(tx, err) {
if r := recover(); r != nil {
err = fmt.Errorf("panic: %v", r)
tx.Rollback()
} else if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}
像这样使用它:
func (r *repoPG) WithTransaction(txFunc func() error) (err error) {
tx := db.NewTx()

defer TxDefer(tx, err)

err = txFunc()
return
}
但这是非常不正确的,因为 err始终是原始的,而不是 txFunc()的结果,对吗?
我怎样才能解决这个问题?

最佳答案

将错误的地址传递给函数。这允许函数访问调用者变量的当前值。它还允许函数设置变量。
回滚和提交返回错误。这些错误应返回给调用方。

func TxDefer(tx Transaction, perr *error) {
if r := recover(); r != nil {
*perr = fmt.Errorf("panic: %v", r)
tx.Rollback()
} else if *perr != nil {
err = tx.Rollback()
if err != nil {
// replace original error with rollback error
*perr = err
}
} else {
*perr = tx.Commit()
}
}
像这样使用它:
func (r *repoPG) WithTransaction(txFunc func() error) (err error) {
tx := db.NewTx()
defer TxDefer(tx, &err)
err = txFunc()
return
}
在上面的代码中,表达式 *perr的计算结果为 errWithTransaction的当前值。问题中的 err的值是延期时 err的值。

关于go - 一种不使用最新的err值写长延迟的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64634177/

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