の実施を延期するために行くと返します
-
「LIFO」の複数の実行順序を遅らせます。
-
延期、リターン、3の論理値を実行するために返さなければなりません:リターンは、戻り値に結果を記述するための責任がある、最初の実行を返します。その後、いくつかの最後の仕上げを行って開始を延期し、最後に関数は、現在の帳簿価額出口を返します。
関数の戻り値は(戻り値に名前を付けることなく、)が不明である場合は値を返す関数を、よく知られている一方で、戻り値以来、アクションの戻り値として保存された一時変数を作成する言語は、リターンの実装で同様の実装になります行きます戻り値の実装で定義された機能は、保存操作を実行するために返されたときに変数が定義されており、その後の変更は、関数の戻り値を延期(ただし、関数の使用を復帰した後に行われるが延期します変数を定義するので、操作に影響を行う延期変化は、変数の値に戻ります
EG1:という名前の関数の戻り値なし
主パッケージ のインポート"FMT" FUNCメイン(){ fmt.Println:延期と戻り値との間( "戻る"、テスト())//配列が最初に返される、I = 0、ディファー } FUNCテスト()INT {//戻り値はここでは名前が付いていない 私はint型VAR FUNCを延期(){ I ++は 引用された閉鎖//として、それは関数が全体の文脈を延期するに従って実行される現在の値を決定する(私は、「defer1」)fmt.Printlnを。2 = I }() FUNC(){延期 I ++の 機能が実行されたときにクロージャが//引用としてfmt.Println(「defer2」、I)を、それが全体のコンテキストを延期するために応じた電流値を決定します。1 = I }() 戻りI }
試験()= 0最初のiを返します
前defer1に行っdefer2
出力は次のようになります。
defer2 1
defer1 2
戻る:0
EG2:という名前の関数の戻り値を持ちます:
メインパッケージ インポート"FMT" FUNCメイン(){ fmt.Println( "復帰"、テスト()) } (iは整数))FUNC試験({//返回值命名私は ()FUNCを延期{ I ++は fmt.Printlnを( "defer1"、I) }() FUNC(){延期 iは++ fmt.Println( "defer2"、I) }() 私はリターン }
对外部变量的引用
作为函数参数(i),则在defer申明时就把值传递给defer,
出力は次のようになります。
defer2 1
defer1 2
戻る:2
リターンの戻り値の動作機構を理解します:
上記2例との違いを明確にするために、我々は最初に戻り、戻り値の動作メカニズムを理解する必要があります。
復帰はアトミック操作ではない、割り当てに分割され、リターンは、2つのステップ値
EG1を:実際のリターンに二段階の操作を実行するために、戻り値なぜなら名前の、そうではない
(Sとする)の戻り値を指定するに戻り、最初のiがSに割り当てられ、その後の
操作は私のためのようで、行って、それはSには影響しません、sはそう、ので、その後は更新されない
リターンsが変更されません
に対応:
varが私はint型
秒:=私は
S返す
同上、sはすべての操作がに基づいているため、名前の変数iと同等です:EG2
ので、すべて、という名前の変数i(s)は、Iの戻り値です延期操作は、更新
の戻り値Iを