5

再帰関数呼び出しの長いシーケンスから戻るより良い方法はありますか? 私は現在、次のようなマーカー値でパニックに陥っています。

type exitNow int
...
panic(exitnow(0))

一度に複数のレベルを返す。ルート関数では、recover の呼び出しが一般的なエラー処理 (パニックをエラーに変える) を行い、exitNow を特別なケースとして処理します。

これはうまくいきます。もっと良い方法があるかどうか知りたいだけです。

関連する目的で既に bool 戻り値を使用していますが、これに別の戻り値を使用するのは面倒です。(すべての関数へのすべての呼び出しには、if ステートメントが必要です)

それが役立つ場合、これは再帰的な適切なパーサーの実装の一部です。

4

1 に答える 1

3

私は自分のパーサーでこのアプローチを使用しています。ただし、整数値でパニックになることはありません。実際の現在のエラーをパニック メッセージとして使用します。を実行する最上位の呼び出しは、recover()単にファイル/行/列の情報を追加してから、通常の として返しますerror

このメソッドと、すべての関数からエラーを返すだけが、Go でこれを行う唯一の方法です。if err != nil { return }パーサーの場合、パニック アプローチの方がはるかに効果的です。どこにでもパーツが散らばっていないため、レクサー ルールの実装 (および読み取り) がかなり簡単になるからです。

于 2012-11-30T18:26:02.177 に答える