いくつかは、リソースのリリースとして使用することができます。
関数内の1延期実行順序は、最初に書き込まれ、実行される、最初のアフターライト実行(スタック構造は以下)
DeferTest1のFUNC(){ fmt.Println( "私はdefer1だ")を延期 fmt.Println( "私はdefer2だ")を延期 fmt.Println( "私はDeferTest1です") fmt.Println( "私はDeferTest2です") }
結果:
I DeferTest1 I DeferTest2 I defer2 I defer1
値と定義間の関係の2.deferの実行は、文章文関数を延期します
DeferTest2のFUNC(){ I:= 0 fmt.Printf( "I =%D \トン延期"、i)を延期 ため、私は= 10 <; I ++は{ fmt.Printf( "I =%d個の\ tの"、私は) } fmt.Println() }
結果
I = 0、I = 1、I = 2 i = 3、I = 4 I = 5、I = 6、I = 7、I = 8、I = 9、I = 10 私を延期= 0
3.defer原理
まず、次のようにreturn文との違いを見て、延期
あなたは実行が戻り値に割り当てられた結果xを返し、その後、RET命令を実行する時期を参照し、とき延期文の実行、RET命令の前にあることができます。だからここに注意を払います。値と戻りXとの関係。xが値型の場合は、コピーがあります。あなたは、次の例を見ることができます:
①
FUNCのdefer1()INT { X:= 1 {)(FUNCを延期 X ++
}() X返します }
②
FUNC defer2()(Xは整数){ {)(FUNCを延期 X ++ }() 1を返します }
③
FUNCのdefer3()(Yはint){ X:= 1 {)(FUNCを延期 X ++ }() X返します }
④
FUNC defer4()(Xは整数){ {FUNC(X INTを)延期 X ++ }(バツ) 1を返します }
これらのメソッドは、結果を印刷している次のように、戻り値は次のとおりです。
defer1:1 defer2:2 defer3:1 defer4:1
上記の図の説明によると:
①deferを実行する前に、(値のコピーである)は、xに割り当てられた戻り値が、次にxの値を変更し、戻り値は無効であり、それは1を返し
②は、値xの名前が1のx値を延期して、xの延期値を変更し、実行する前に、この時点で、ある返し、xが、増加されるので、2のリターン
③戻り値がY、事前ディファー実行の名前で、yは値1が割り当てられ、変更を実行延期がX、Yに影響を及ぼさない、1が返され
④戻り値がXである - 名前が、パラメータxに値のコピーが渡された場合には、パラメータを有する関数funcの延期実行、である、スコープ内部ではなく、外部の衝撃xは、それは1のリターンであります