1.延期とは何ですか
延期登録遅延は、ゴーと呼ばれる言語を提供するための仕組みである:現在の関数が実行を完了した後(正常終了またはリターンによって引き起こされるパニックの異常終了を含む)関数やステートメントをしてみましょう。
2.延期アプリケーションのシナリオ
文は、いくつかのシーンペア操作を延期することを意図している:接続口/接続を閉じ、ロック/ラッチ解除、ファイルのオープン/クローズのファイル。
3.延期原則
文の延期の実装は、すぐに実行されませんが、関数の戻り値の前にスタックに入り、最後のアウト(FILO)順番を押します。そのステートメントは、最終的な実行延期に定義された最初です。理由は、最後のアウト機能は、後に、リソースの前面に自然な最初の実行を依存して定義され、そうでない場合、最初の前の実行場合は、バックに依存している、機能はありません。
4.延期参照
参照することにより、以下の2つの外部の変数のための延期声明の定義:
- パラメータとクロージャの機能として組み込まれています。パラメータの関数として、値が定義されて延期に入れて、キャッシュされた延期に渡されます。
- パッケージが閉じとして参照、それは関数が実際に全体のコンテキストを延期することによる起動電流値を決定します。
5.延期はピットを強化しました
ステッピングピットを回避するための鍵は、この文を理解することです。
return xxx
後にコンパイルされたこの文は、3つの命令になることがあります。
1. 返回值 = xxx
2. 调用defer函数
3. 空的return
ステップ3は、return文が真のコマンドで、ステップ2が定義文延期し、戻り値を操作される可能性がありますされています。
コード例6
例1:
func f() (r int) {
defer func() {
r++
}()
return 0
}
解体過程:
func f() (r int) {
// 1.赋值
r = 0
// 2.闭包引用,返回值被修改
defer func() {
r++
}()
// 3.空的return
return
}
ディファークロージャが参照されているので、戻り値が変更されるので、)(fは1を返します。
例2:
func f() (r int) {
t := 5
defer func() {
t = t + 5
}()
return t
}
解体過程:
func f() (r int) {
t := 5
// 1.赋值
r = t
// 2.闭包引用,但是没有修改返回值r
defer func() {
t = t + 5
}()
// 3.空的return
return
}
操作の戻り値rステップ2が向けられていないので、5が返されます。
例3:
func f() (r int) {
defer func(r int) {
r = r + 5
}(r)
return 1
}
解体過程:
func f() (r int) {
// 1.赋值
r = 1
// 2.r作为函数参数,不会修改要返回的那个r值
defer func(r int) {
r = r + 5
}(r)
// 3.空的return
return
}
パラメータrの関数として第2のステップは使用されているので、唯一のコピーは、ディファーステートメントの内部とR rの外側には、実際には2つの変数、変数は、それが6を返さないように、外側の変数はrは影響を与えない変更をrはしかし、1を返します。
個人ホームページ: