前提
golang 1.18
実現したいこと
無名関数を変数に代入し、特定のエラーの時のみ再実行したい。
発生している問題・エラーメッセージ
再実行した時に、無名関数内で使用している変数の値がnil pointerになります。
該当のソースコード
go
1 2func (us *Interactor) CreateTrs(ctx context.Context, trs *transaction.Transaction) (*transaction.Transaction, apperror.AppError) { 3 var err apperror.AppError 4 5 // begin db transaction 6 f := func() apperror.AppError { 7 err := us.tx.WithTx(ctx, func(ctx context.Context) apperror.AppError { 8 fmt.Println("-------------------------") 9 fmt.Println(trs) 10 fmt.Println("-------------------------") 11 if err = us.transactionService.ConfirmNotExceedAmountLimit(ctx, trs.UserID, trs.Amount); err != nil { 12 return err 13 } 14 15 trs, err = us.transactionRepository.Save(ctx, trs) 16 if err != nil { 17 return err 18 } 19 20 return nil 21 }) 22 return err 23 } 24 err = f() 25 if errors.Is(特定のエラー)) { 26 err = f() 27 } 28 if err != nil { 29 return nil, err 30 } 31 32 return trs, nil 33} 34
errors.Isがtrueになった場合 f()が再試行されるとこまではいいのですが、 trsがnilになり nil pointerになってしまいます。
go
1fmt.Println("-------------------------") 2fmt.Println(trs) 3fmt.Println("-------------------------") 4 5// output 6------------------------- 7<nil> 8------------------------- 9
試したこと
無名関数の代入前にnilになる変数をコピーすれば nilにならない事を確認しました。
go
1 2ttt := trs 3f := func() apperror.AppError { 4// tttを使う 5 6
上記で一応エラーは回避できたのですが、これが良い方法なのか、中で何が起こっているのかがわかっておりません。
知見がございましたらアドバイス頂けると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/03 14:03