目次
リソースクリーニングは、最も一般的な使用シナリオです
Deferの実行命令は、最初のアウト(LIFO)の最後です
パラメーターは、延期が記述されたときに決定されます
ヒント:ループでの乱用を避けてください
ホームページ バックエンド開発 Golang 延期声明を説明します

延期声明を説明します

Jul 14, 2025 am 02:57 AM

Deferのコア関数は、現在の関数が戻るまで関数呼び出しの実行を遅らせることです。これは、リソースクリーニングによく使用されることがよくあります。具体的には、次のものが含まれます。1。ファイル、ネットワーク接続、ロック、その他のリソースがタイムリーにリリースされることを確認してください。 2。実行命令は最初のOut(LIFO)で遅れており、最後に定義された延期が最初に実行されます。 3.パラメーターは、延期が定義されているときに決定され、非消費中に評価されます。可変変更が必要な場合は、閉鎖またはポインターを使用できます。 4.ループでの延期の乱用を避け、リソースの蓄積がタイムリーに解放されるのを防ぎます。

延期声明を説明します

Goのdefer Statementはシンプルに見えますが、適切に使用すると、コードの明確さと堅牢性を向上させることができます。そのコア関数は、現在の関数が戻るまで関数呼び出しの実行を遅らせることです。リソースリリース、ロック解除、ロギング、その他のシナリオで一般的に使用されます。

延期声明を説明します

リソースクリーニングは、最も一般的な使用シナリオです

ファイル、ネットワーク接続、ロック、その他のリソースを処理する場合、タイムリーにリリースすることが非常に重要です。 defer 、機能が終了する前にこれらの操作が実行されることを保証し、省略を回避できます。

たとえば、読み取り用のファイルを開きます。

延期声明を説明します
 file、_:= os.open( "emple.txt")
defer file.close()

このようにして、関数がどのように終了しても(中央で通常の戻りまたはエラーが発生します)、 file.Close()が呼び出されます。
deferを追加しない場合は、各リターンの前にfile.Close()手動で書き込む必要があります。これは見逃しやすく、冗談のようです。

一般的なリソースクリーニングシナリオは次のとおりです。

延期声明を説明します
  • ファイルを閉じる(上記の例のように)
  • ネットワーク接続は閉じられています
  • ロックのリリース( mutex.Unlock()など)
  • データベーストランザクションコミットまたはロールバック

Deferの実行命令は、最初のアウト(LIFO)の最後です

同じ関数で複数のdeferを記述すると、実行命令が逆転します。最後の順序が最初に実行されます。

例えば:

 func main(){
    defer fmt.println( "1")
    defer fmt.println( "2")
    defer fmt.println( "3")
}

出力は次のとおりです。

 3
2
1

これは、ネストされたリソース管理に役立ちます。たとえば、複数のファイルを開いたり、複数のロック層を追加したりすると、逆順序でリリースする方が安全です。


パラメーターは、延期が記述されたときに決定されます

これは多くの人々によって簡単に見落とされます。 defer後の関数パラメーターは、実行時ではなく定義時に評価されます。

この例を見てください:

 func a(){
    i:= 0
    defer fmt.println(i)
    私  
}

この関数を実行し、 1ではなく0を印刷します。 iの値は、 deferが定義されているときに決定されるためです。

変更後に変数値をdeferたい場合は、ポインターを渡すか、閉鎖を使用することを検討できます。

 func b(){
    i:= 0
    defer func(){
        fmt.println(i)
    }()
    私  
}

この時点で、 1印刷されています。閉鎖は、実際に実行されるときに変数の現在の値をキャプチャします(コピーではなく、参照であることに注意してください)。


ヒント:ループでの乱用を避けてください

deferは便利ですが、ループで使用する場合は注意してください。すぐに実行されないため、蓄積が多すぎると、過度のメモリ使用量やリソースの失敗が時間内に解放される可能性があります。

例えば:

 _、filename:= range filenames {
    ファイル、_:= os.open(filename)
    defer file.close()
}

このコードの問題は、ループが終わった後にすべてのファイルが閉じられないことです。多くのファイルがある場合、システムの制限を超える場合があります。この場合、シャットダウンを手動で制御することをお勧めします。


基本的にそれだけです。 defer GOの非常に実用的な機能です。その作業メカニズムを理解することは、より簡潔で安全なコードを書くのに役立ちます。

以上が延期声明を説明しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

オーディオ/ビデオ処理に移動します オーディオ/ビデオ処理に移動します Jul 20, 2025 am 04:14 AM

オーディオとビデオ処理の中核は、基本的なプロセスと最適化方法を理解することにあります。 1.基本的なプロセスには、取得、エンコード、送信、デコード、再生が含まれ、各リンクには技術的な困難があります。 2。オーディオおよびビデオの異常、遅延、音のノイズ、ぼやけた画像などの一般的な問題は、同期調整、コーディング最適化、ノイズ減少モジュール、パラメーター調整などを通じて解決できます。 3. FFMPEG、OPENCV、WeBRTC、GSTREAMER、およびその他のツールを使用して機能を達成することをお勧めします。 4.パフォーマンス管理の観点から、ハードウェアの加速、解像度フレームレートの合理的な設定、並行性の制御、およびメモリの漏れの問題に注意を払う必要があります。これらの重要なポイントを習得すると、開発効率とユーザーエクスペリエンスの向上に役立ちます。

GoでKubernetesオペレーターの開発 GoでKubernetesオペレーターの開発 Jul 25, 2025 am 02:38 AM

Kubernetesoperatorを書く最も効率的な方法は、Goを使用してKubeBuilderとController-Runtimeを組み合わせて使用することです。 1.オペレーターのパターンを理解する:CRDを介してカスタムリソースを定義し、コントローラーを作成してリソースの変更を聞き、和解ループを実行して予想される状態を維持します。 2。KubeBuilderを使用してプロジェクトを初期化し、APIを作成してCRD、コントローラー、構成ファイルを自動的に生成します。 3. API/V1/MyApp_Types.goでCRDの仕様とステータス構造を定義し、MakeManifestsを実行してCrdyamlを生成します。 4。コントローラーの和解

PostgreSQL/MySQLのクエリ最適化テクニックに移動します PostgreSQL/MySQLのクエリ最適化テクニックに移動します Jul 19, 2025 am 03:56 AM

ApptlicationsInteractingingとfostresqlormysql、focusonindexing、selectivequeries、connectionhandling、caching、andormefficiency.1)使用プロペラインデックスの使用 - 識別のために識別を識別し、colulti-columnsを使用することを識別します

科学的なコンピューティングと数値分析に進みます 科学的なコンピューティングと数値分析に進みます Jul 23, 2025 am 01:53 AM

GO言語は科学的計算と数値分析に使用できますが、理解する必要があります。利点は、並行性のサポートとパフォーマンスにあります。これは、分散ソリューション、モンテカルロシミュレーションなどの並列アルゴリズムに適しています。 GonumやMAT64などのコミュニティライブラリは、基本的な数値計算関数を提供します。ハイブリッドプログラミングを使用して、CGOまたはインターフェイスを介してC/CとPythonを呼び出して実用性を向上させることができます。制限は、エコシステムがPythonほど成熟しておらず、視覚化と高度なツールは弱く、一部のライブラリ文書は不完全であることです。 GO機能に基づいて適切なシナリオを選択し、それらを詳細に使用するソースコードの例を参照することをお勧めします。

画像操作ライブラリに移動します 画像操作ライブラリに移動します Jul 21, 2025 am 12:23 AM

一般的なGO画像処理ライブラリには、イメージング、BIMG、Imagickなどの標準的なライブラリイメージパッケージとサードパーティライブラリが含まれます。 1.画像パッケージは、基本操作に適しています。 2。イメージングには完全な機能と単純なAPIがあり、ほとんどのニーズに適しています。 3. BIMGはLIBVIPに基づいており、パフォーマンスが強いため、大きな画像や高い並行性に適しています。 4。ImagicickはImageMagickをバインドします。これは強力ですが、重い依存関係を持っています。画像のスケーリングとトリミングをすばやく実装します。イメージングライブラリを使用して、COSSIZEおよびCROPANCHOR機能の数行のコードを介してそれを完了し、複数のパラメーター構成をサポートできます。フィルターの追加または調整トーンは、Grayscなどの想像力によって提供される色変換関数を通じて実現できます

GOのポインターを備えたスタックvsヒープ割り当て GOのポインターを備えたスタックvsヒープ割り当て Jul 23, 2025 am 04:14 AM

スタック割り当ては、明確なライフサイクルを備えた小さなローカル変数に適しており、速い速度で多くの制限で自動的に管理されます。ヒープ割り当ては、長期または不確実なライフサイクルのデータに使用され、柔軟性がありますが、パフォーマンスコストがあります。 GOコンパイラは、エスケープ分析を通じて変数割り当て位置を自動的に決定します。変数が現在の関数範囲から逃げる可能性がある場合、ヒープに割り当てられます。脱出を引き起こす一般的な状況には、ローカル変数ポインターの返却、インターフェイスタイプへの値の割り当て、ゴルチンの通過が含まれます。エスケープ分析の結果は、-gcflags = "-m"を介して表示できます。ポインターを使用する場合、不必要なエスケープを避けるために、可変ライフサイクルに注意を払う必要があります。

Go byの例でStdinから読む Go byの例でStdinから読む Jul 27, 2025 am 04:15 AM

FMT.Scanfを使用して、単純な構造化データに適したフォーマット入力を読み取りますが、スペースに遭遇すると文字列が切断されます。 2。bufio.scannerを使用して行ごとに読み取り、マルチライン入力、EOF検出、パイプライン入力をサポートし、スキャンエラーを処理できることをお勧めします。 3。Io.Readall(os.stdin)を使用して、すべての入力を一度に読み取ります。大きなブロックデータまたはファイルストリームの処理に適しています。 4.リアルタイムの主要な応答には、golang.org/x/termなどのサードパーティライブラリが必要であり、Bufioは従来のシナリオには十分です。実用的な提案:インタラクティブなシンプルな入力にFMT.SCANを使用し、ライン入力またはパイプラインにbufio.scannerを使用し、io.readallを使用して大規模なブロックデータを使用し、常に処理します

Goのパニックから回復する方法は? Goのパニックから回復する方法は? Jul 23, 2025 am 04:11 AM

パニックは、Goのプログラム「心臓発作」のようなものです。回復は、クラッシュを防ぐための「応急処置ツール」として使用できますが、回復は延期関数でのみ有効になります。 1.サービスの経過、ログログ、およびフレンドリーなエラーを返すために、回復が使用されます。 2. Deferと組み合わせて使用する必要があり、同じゴルウチンでのみ有効になります。プログラムは、回復後にパニックポイントに戻りません。 3.上位レベルまたは重要な入り口で使用し、悪用しないでください。エラー処理の使用を優先しないことをお勧めします。 4.一般的なパターンは、Saferun関数をカプセル化して、可能なパニックロジックをラップすることです。その使用シナリオと制限を習得することによってのみ、その役割を果たすことができます。

See all articles