まず、どのような遅延?
•遅延文が前に、この関数への関数呼び出しを実行するために使用されていることを遅延(延期)ステートメントは、ステートメントの戻りを遅らせました。
遅延機能
1、あなたは、関数で複数の延期ステートメントを追加することができます。
関数が最後に実行された場合•、これらのステートメントは、■逆順実行し、最終的に関数から復帰を延期します。オープンなオペレーティングリソースのいくつかは、早期に返却する必要がエラーに遭遇した場合は特に、あなたは適切なリソースに戻る前にオフにする必要があり、または原因のリソースリーク、あなたがやっている他の問題を可能性があり
、それは、後方の使用である延期、あなたは延期呼び出しの多くを持っている場合•ファーストアウトモード
•実行の建から方法(実行するエラー)
メインパッケージ インポート" FMT " インポート( " ベース" ) FUNC)を(主{ 延期てfuncA() funcBの() funcC()延期 fmt.Println(" 主オーバー... " ) } てfuncA(){FUNC fmt.Println(" 这是てfuncA " ) } FUNC funcBの(){ fmt.Println(" 这是funcBの" ) } funcC(){FUNC fmt.Println(" 这是funcC " ) }
(スタックデータ構造defeに類似)遅延
メインパッケージ インポート" FMT " 型人構造体を{ FirstNameと氏名列 } FUNC(P者)のfullName(){ fmt.Printf(" %S%S " 、p.firstName、p.lastName) } メインFUNC(){ P : = {人" スティーブン"、" 王" } ディファーp.fullName() fmt.Print(" ようこそ" ) }
パラメータを持つ延期機能
パッケージメイン インポート" FMT " FUNCメイン(){ A: = 5。 B: = 6 延期printAdd(A、B、真の) A = 10 B = 7 printAdd(A、B、偽に) } FUNC printAdd(A、B INT、内のフラグBOOL ){ IF のフラグ{ fmt.Printf(" 遅延実行機能printAdd()、パラメータ、それぞれのBは、%D、%dを、2つの数の合計:%D \ N- "、A、B、A + B ) } 他{ fmt.Printf(「非遅延の関数printAddは()のパラメータ、それぞれのBは、%D、%dを、2つの数の和、実行:%D \ N- '、A、B、A + B) } }
第二に、ダウンタイムやダウンタイムの回復がパニックを回復します
( - )、パニック機構回復
1.概要:
•パニック:意味パニック__回復:「■復元_
•Goはジャワのような例外メカニズム、それが例外をスローしませんが、パニックの使用やメカニズムを回復しません。常に。私たちのコードは何であるか、またはパニックのような非常に少数のそのようなことする必要があり、それは言うことです最後の手段として使用されるべきであることを覚えていない
•囲碁言語使用panicO、回復()、非常にプログラムを実施ハンドリング特別な例外
〇 panicOは、パニック、割り込みプログラムの実行に現在のプログラムを聞かせて
機能延期実行する〇 recoverO、およびプログラムを返す
〇 Panics-機能に内蔵され、メイクへの道に元の制御フローを中断することができます人々が流れパニック。
乗関数Fはパニック、Fが中断された関数の実行を呼び出しますが、F関数実行の遅延は、通常、その場所の呼び出しでそれを呼ばれる場所にF戻ると、Fは、コールのように振る舞うときパニック。このプロセスは、この時間プログラムが終了、すべてのゴルーチン関数呼び出しの戻りでパニックが発生するまで続けます。
正方形のパニックは、直接ことも発生したパニックを呼び出すことができます このような配列へのクロスボーダーのアクセスなど、実行時エラー、。
〇 Recoverは、組み込みの回復ゴルーチンでパニック入力します。することができます機能
〇 recover有効なだけ遅延機能を。実装の通常の過程では、現在のゴルーチンパニック、呼び出し•回復は、入力値のパニックをキャプチャすることができます。ゼロ、無他の影響を返します回復するために呼び出すと、通常の実行を再開
主パッケージ のインポート" FMT " FUNCメイン(){ てfuncA() funcBの() funcC() fmt.Println(" 主オーバー" ) } FUNCてfuncA(){ fmt.Println(" 何があるてfuncA " ) } FUNC funcBの() { 延期FUNC(){ IF MSG:=回復(); MSG =!nilの{ fmt.Println(" それは戻り値が回復取得し、復元:" 、MSG) } }() fmt.Printlnが(" 何がfuncBのです" ) のための I:=0 ; I < 10 ; I ++ { fmt.Println(" I:" 、I) IF I == 。5 { // パニック( "funcBのそれはパニック") } } } FUNC funcC(){ ディファーFUNC(){ FMT。 println(" 遅延機能を実行する" ) MSG: = (回復) fmt.Println(" 戻り値を回復入手:" 、MSG) }() fmt.Println(" 何がfuncCである" ) パニック("funcCパニック" ) }