検索
ホームページバックエンド開発Golang8 つのデモを使用して Go 言語の defer の 5 つの主要な機能を理解する

Go 言語で defer キーワードを使用すると、関数の終了までコードの実行が遅れる可能性があります。開発では、開いているファイル記述子を閉じる、接続を閉じる、リソースを解放するなど、その後の作業を完了するために defer キーワードを使用することがよくあります。

func demo0() {
    fileName := "./test.txt"
    f, _ := os.OpenFile(fileName, os.O_RDONLY, 0)
    defer f.Close()

    contents, _ := ioutil.ReadAll(f)
    fmt.Println(string(contents))}

deferキーワードは通常、リソースを解放し忘れることを防ぐために、リソースを開くコードの直後に続きます。defer で宣言されたコードは、関数が終了するまで実際には実行されません。 defer はシンプルで使いやすいですが、 しかし、その機能を無視すると、開発中に混乱に直面することになります。そこで、defer の 5 つの主要な機能をまとめ、8 つのデモを通して defer の機能を段階的に紹介しました。

機能 1: 複数の defer が使用される場合の呼び出し順序: 先入れ、後出し

複数の defer キーワードが使用される場合、最初に宣言された defer ステートメントが後で呼び出されます。 「スタック」の

first-in-last-out 機能と同様に、この defer の機能も理解しやすいです。 最初に によって開かれたリソースは、後続のコードによって依存される可能性があるため、 の後に を放しても安全です。

func demo1() {
    for i := 0; i 機能 2: スコープは現在の関数であり、さまざまな関数の下にさまざまな遅延スタックがあります<h2></h2>デモ 2 を実行します。結果から、最初の匿名関数と 2 番目の匿名関数が実行されていることがわかります。匿名関数 関数の遅延実行の順序は重要ではありません。 <p>遅延スコープは現在の関数のみであり、現在の関数の最後に実行されるため、関数ごとに異なる遅延スタックが存在します。 <br></p><pre class="brush:php;toolbar:false">func demo2() {
    func() {
        defer fmt.Println(1)
        defer fmt.Println(2)
    }()

    fmt.Println("=== 新生代农民工啊 ===")

    func() {
        defer fmt.Println("a")
        defer fmt.Println("b")
    }()}// 2// 1// === 新生代农民工啊 ===// b// a
demo3_1 を実行し、結果に従って次の結論を得ることができます: defer in

仮パラメータnの値は、実行時のではなく、宣言時に確定するため、後続の変数numがどのように変化しても出力結果には影響しません。延期の。

func demo3_1() {
    num := 0
    defer func(n int) {
        fmt.Println("defer:", n)
    }(num)
    // 等同 defer fmt.Println("defer:", num)

    for i := 0; i demo3_2 を実行します。ここでの defer の最終出力結果が変数 num と同じなのはなぜですか?ここではポインタが使用されているためです。 <p>defer <br><strong> を宣言すると、仮引数 p ポインタが指すアドレスが変数 num を指していることが確認され、変数 num が変化します。したがって、defer </strong> が実行されると、出力は p ポインタが指す変数 num の現在の値になります。 <strong><pre class="brush:php;toolbar:false">func demo3_2() {
    num := 0
    p := &num    defer func(p *int) {
        fmt.Println("defer:", *p)
    }(p)

    for i := 0; i 
defer3_3 をもう一度見てください。defer によって出力された変数は、関数パラメータを介して渡されません。「グローバル変数」num は defer

が実行されたときにのみ取得されるため、defer の出力結果は次のようになります。変数と同じです。num は一貫しています。

func demo3_3() {
    num := 0
    defer func() {
        fmt.Println("defer:", num)
    }()

    for i := 0; i <strong>機能 4: return と defer の実行順序: return first defer then</strong>defer と return は関数の最後に実行されますが、return が前に実行されることがわかります。 defer;<h2><pre class="brush:php;toolbar:false">func demo4_1() (int, error) {
    defer fmt.Println("defer")
    return fmt.Println("return")}// return// defer
これは出力結果

からも明らかですが、returnとdeferの実行順序と

**関数の戻り値** 「会う」、多くの複雑なシナリオが発生します。 demo4_2 では、関数は を使用して戻り値 に名前を付け、最終的な出力結果は 7 です。

(1つ目) 変数 num を戻り値として使用し、初期値は 0;
  1. (2 回目) その後、変数 num には値 10 が割り当てられます;
  2. (その後) 戻ると、変数 num には戻り値として値 2 が再割り当てされます;
  3. (その後) return 後に defer が実行され、変数 num が取得されて変更され、値は 7;
  4. (最後に) 変数 num が戻り値として使用され、最終的な関数の戻り結果は 7;
  5. func demo4_2() (num int) {
     num = 10
     defer func() {
         num += 5
     }()
    
     return 2}// 7
  6. 別の例を見てみましょう。
  7. demo4_3 では、関数は
匿名の戻り値

を使用し、最終的な結果出力は 2 です。プロセスは次のとおりです:

関数に入りますが、この時点では戻り値の変数は作成されません;
  1. は変数 num を作成します値を 10 に割り当てます。
  2. return のとき、関数の戻り値変数を作成し、値 2 を割り当てます。この戻り値変数は匿名変数、または次のように考えることができます。 a、b、c、または d 変数 ... ですが、それは変数 num ではありません。
  3. defer、変数 num をどのように変更しても、それは変数 num とは何の関係もありません。関数の戻り値;
  4. したがって、最終的な関数の戻り結果は 2 になります;
  5. func demo4_3() int {
     num := 10
     defer func() {
         num += 5
     }()
    
     return 2}// 2
  6. 特徴 5: パニックが発生すると、宣言された defer がスタックから飛び出します

    デモ5_1 を実行すると、パニックが発生すると、宣言された defer がトリガーされてスタックから飛び出し、パニックになることがわかりますが、パニック後に宣言された defer は実行されません。

    func demo5_1() {
     defer fmt.Println(1)
     defer fmt.Println(2)
     defer fmt.Println(3)
    
     panic("没点赞异常") // 触发defer出栈执行
    
     defer fmt.Println(4) // 得不到执行}

    この機能を使用することで、遅延時の回復を通じてパニックを捕捉し、プログラムのクラッシュを防ぐことができます。

    func demo5_2() {
     defer func() {
         if err := recover(); err != nil {
             fmt.Println(err, "问题不大")
         }
     }()
    
     panic("没点赞异常") // 触发defer出栈执行
    
     // ...}
    添付

    完全なコード:

    github.com/newbugcoder/learngo/tre...

以上が8 つのデモを使用して Go 言語の defer の 5 つの主要な機能を理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はlearnkuで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Golang vs. Python:並行性とマルチスレッドGolang vs. Python:並行性とマルチスレッドApr 17, 2025 am 12:20 AM

Golangは高い並行性タスクにより適していますが、Pythonには柔軟性がより多くの利点があります。 1.Golangは、GoroutineとChannelを介して並行性を効率的に処理します。 2。Pythonは、GILの影響を受けるが、複数の並行性メソッドを提供するスレッドとAsyncioに依存しています。選択は、特定のニーズに基づいている必要があります。

GolangとC:パフォーマンスのトレードオフGolangとC:パフォーマンスのトレードオフApr 17, 2025 am 12:18 AM

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

Golang vs. Python:アプリケーションとユースケースGolang vs. Python:アプリケーションとユースケースApr 17, 2025 am 12:17 AM

seetgolangforhighperformance andconcurrency、ithyforbackendservicesandnetworkプログラミング、selectthonforrapiddevelopment、datascience、andmachinelearningduetoistsversitydextentextensextensentensiveLibraries。

Golang vs. Python:重要な違​​いと類似点Golang vs. Python:重要な違​​いと類似点Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

Golang vs. Python:使いやすさと学習曲線Golang vs. Python:使いやすさと学習曲線Apr 17, 2025 am 12:12 AM

GolangとPythonはどのような側面で使いやすく、より滑らかな学習曲線を持っていますか? Golangは、高い並行性と高性能のニーズにより適しており、学習曲線はC言語の背景を持つ開発者にとって比較的穏やかです。 Pythonは、データサイエンスと迅速なプロトタイピングにより適しており、初心者にとって学習曲線は非常にスムーズです。

パフォーマンスレース:ゴラン対cパフォーマンスレース:ゴラン対cApr 16, 2025 am 12:07 AM

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

Golang vs. C:コードの例とパフォーマンス分析Golang vs. C:コードの例とパフォーマンス分析Apr 15, 2025 am 12:03 AM

Golangは迅速な発展と同時プログラミングに適していますが、Cは極端なパフォーマンスと基礎となる制御を必要とするプロジェクトにより適しています。 1)Golangの並行性モデルは、GoroutineとChannelを介した同時性プログラミングを簡素化します。 2)Cのテンプレートプログラミングは、一般的なコードとパフォーマンスの最適化を提供します。 3)Golangのごみ収集は便利ですが、パフォーマンスに影響を与える可能性があります。 Cのメモリ管理は複雑ですが、コントロールは問題ありません。

Golangの影響:速度、効率、シンプルさGolangの影響:速度、効率、シンプルさApr 14, 2025 am 12:11 AM

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SublimeText3 Mac版

SublimeText3 Mac版

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

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール