文法の使用を延期
//関数呼び出しは、そうでない場合、コンパイラは間違って行くだろう、延期ステートメントまたはメソッドの呼び出し文ではなく、他の文の後ろでなければなりません。 パッケージメイン インポート( "FMT" ) FUNCのFOO(N INT)INT { 延期のn ++ //延期fmt.Println(N) リターンのn } FUNCのmain(){ たint型= 100 FOO(I) }
#コマンドライン引数 延期の式は、関数呼び出しでなければなりません 構文エラー:予期せぬ++文の終わりに
defer
目的説明書
含まれている defer
機能の声明を、それが別の関数を呼び出し、関数が戻る前になります。
延期バック機能は、関数の実行延期文どこエンドと呼ばれています。
パッケージメイン インポート( "FMT" ) タイプの人のstruct { firstNameの文字列 lastNameの文字列 } FUNC(P者)のfullName(){ fmt.Printf( "%S%S"、p.firstName、p.lastName) } FUNCのmain(){ P:= {人 firstNameの: "ジョン"、 LASTNAME: "スミス"、 } 延期p.fullName() fmt.Printf( "ようこそ") }
上記の手順でライン11、a
5の初期値。ライン12は、 defer
時間文、以来 a
5に等しく、したがって、遅延の関数 printA
引数も5に等しいです。第13行では、次いで、 a
10個の値に変更します。次の行は、プリントアウトされます a
値を。プログラムを印刷:
value of a before deferred function call 10
value of a in deferred function 5
上記の出力から、我々はコールでそれを見ることができ defer
、我々はなりますが、文の後に a
10を改正ますが、遅延関数呼び出し printA(a)
、印刷はまだ5です。
延期栈
関数が内で複数回呼び出されたとき defer
の時間、移動がします defer
実行のLIFO(ラストにはまずアウト、LIFO)の順序に従って、スタックに置かれ、そして呼び出します。
ここでは、使用する小さなプログラムの書き込み defer
逆印刷の文字列にスタックを。
パッケージメイン インポート( "FMT" ) FUNCのmain(){ 名前:= "のNaveen" fmt.Printf( "のorignal文字列:%sの\ n" は、文字列(名前)) fmt.Printf( "逆に文字列:") _ため、V:=範囲[]ルーン(名){ 延期fmt.Printf( "%cの"、V) }}
orignal文字列:のNaveen 逆に文字列:neevaN
の実用化を延期
- ファイルは自動的に開口部が閉じられた後
FUNC CopyFileメソッド(dstName、srcNameという文字列)(書き込みのInt64、ERRエラー){ SRC、ERR:= os.Open(srcNameという) {ERR!= nilの場合 リターン } 延期src.Close() DST、ERR = os.Create(dstName) {ERR!= nilの場合 リターン } 延期dst.Close() //他のコード リターンio.Copy(DST、SRC) }
入力ファイル出力を開いた後、関係なく、プロセスのコードの後ろに影響を与え、これらの2つのファイルが自動的に閉じることができます。
- ミューテックスオブジェクトを自動的にロックした後に解放されます
FUNC fooの(...){ mu.Lock() 延期mu.Unlock() //コード・ロジック }
自動的に関数fooが終了した後にリリースミューロックを確認してください。
WaitGroup的退出
パッケージメイン インポート( "FMT" 「同期」 ) タイプRECT構造体{ 長さはint 幅int型 } FUNC(R RECT)領域(WG * sync.WaitGroup){ 延期wg.Done() もしr.length <0 { fmt.Printf( "RECT%のVの長さがゼロより大きくなければならない\ n"、R) リターン } もしr.width <0 { fmt.Printf( "RECT容量%の幅がゼロより大きくなければならない\ n"、R) リターン } エリア:= r.length * r.width fmt.Printf( "RECT容量%の面積%D \ n" は、R、面積) } FUNCのmain(){ VAR WG sync.WaitGroup R1:= RECT {-67、89} R2 = RECT {5} -67 R3:= RECT {8,9} rects:= [] RECT {R1、R2、R3} _ため、V:=レンジrects { wg.Add(1) (&WG)v.areaを行きます } wg.Wait() fmt.Println(「すべてのゴールーチンは実行を終了します」) }