Я пишу некоторые функции начала / принятия / отката транзакции, и я хочу связать блок, чтобы предотвратить забытую фиксацию
Я пишу так:
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()
}
}
Работает, но использует "указатель на интерфейс", я не могу найти спецификации указателя на интерфейс.
Итак, я не уверен, что этот код достаточно хорош. Не могли бы вы дать несколько предложений?
благодаря Тейзеру и Кори Огберну, это мое исправленное решение:
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()
}
}