延期行く使用

 

文法の使用を延期

//関数呼び出しは、そうでない場合、コンパイラは間違って行くだろう、延期ステートメントまたはメソッドの呼び出し文ではなく、他の文の後ろでなければなりません。
パッケージメイン
インポート(
	"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(「すべてのゴールーチンは実行を終了します」)
}

  

 

 

おすすめ

転載: www.cnblogs.com/-wenli/p/11825433.html