ホームページ  >  記事  >  バックエンド開発  >  Golang関数でキーワードdeferとrecoverを一緒に使用する方法

Golang関数でキーワードdeferとrecoverを一緒に使用する方法

WBOY
WBOYオリジナル
2023-05-15 23:21:041521ブラウズ

Golang は、もともと Google によって開発され、2009 年に初めてリリースされた、効率的で簡潔で学びやすいプログラミング言語です。プログラマーの生産性とコードの明瞭さを向上させるように設計されています。 Golang では、プログラム内で発生する可能性のあるエラーを処理するために、関数キーワード defer とcover がよく一緒に使用されます。この記事では、これら 2 つのキーワードの使用法を紹介し、いくつかの例を通して実際の応用例を説明します。

1. defer の使用方法

defer はキーワードであり、関数の実行後に特定のコードの実行を遅らせるために使用されます。遅延実行とは、関数が戻る前に、これらのコードがスタックに追加され、次々に実行されることを意味します。

defer ステートメントの構文は次のとおりです。

defer function_name(argument)

ここで、function_name は遅延する必要がある関数の名前、引数は次のとおりです。はオプションのパラメータリストです。関数の実行が完了し、return ステートメントが実行されると、すべての defer ステートメントが順番に実行されます。

次は、defer ステートメントの具体的な使用法を示すサンプル プログラムです。

package main

import "fmt"

func main() {
    defer fmt.Println("Hello")
    fmt.Println("World")
}

このプログラムは、 fmt.Println("World " を実行した後、「World
Hello」を出力します。 )、プログラムは defer ステートメントを実行し、それをスタックに追加します。 main() 関数が戻ると、スタックが順番にポップされ、最後に実行されるのは defer ステートメント内の print ステートメントです。

2. リカバリの使用方法

プログラムでエラーが発生すると、プログラムは実行を停止して終了します。ただし、場合によっては、プログラムの実行を継続してエラーを処理したい場合もあります。 Golang では、recover キーワードを使用してこれを実現できます。

recover は、パニックから回復するために使用される defer ステートメントでのみ使用される組み込み関数です。プログラムがパニックになると、実行を強制的に停止し、defer ステートメントで回復関数を呼び出すことでプログラムの実行を再開します。

以下は、recover ステートメントの具体的な使用法を示すサンプル プログラムです。

package main

import (
    "fmt"
    "os"
)

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered:", r)
        }
    }()

    fmt.Println("Start")
    panic("Something wrong")
    fmt.Println("End")
    os.Exit(0)
}

このプログラムでは、main() 関数の defer ステートメントで Recovery 関数を使用します。 defer ステートメント内の匿名関数は、パニックが発生するかどうかを判断し、関連情報を出力し、パニックが発生した場合にはプログラムの実行を再開します。

このプログラムを実行すると、最初に「Start」という出力が表示され、その後プログラムはパニックをスローし、実行制御フローが中断され、print ステートメントは実行されません。ただし、recover関数を使用してプログラムの実行を再開するため、プログラムが終了する前に「Recovered:Something lower」が出力されます。

3. deferとrecoverの併用

実際のプログラミングでは、deferとrecoverは併用するのが一般的です。たとえば、操作が失敗したときにプログラムをロールバックする必要がある場合、操作の開始前にトランザクションを作成し、操作の完了後にトランザクションをコミットできますが、操作が失敗した場合は、defer ステートメントを使用して操作をロールバックできます。同時に、異常なエラーが発生した場合は、リカバリ機能を使用してプログラムの実行を再開し、特定の操作を実行できます。

以下はデータベース操作に関するサンプル プログラムで、遅延と回復がどのように併用されるかを示しています。

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "username:password@tcp(host:port)/database")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    tx, err := db.Begin()
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Transaction Rollback:", r)
            tx.Rollback()
        }
    }()
    _, err = tx.Exec("INSERT INTO users(name) VALUES (?)", "Alice")
    if err != nil {
        panic(err)
    }
    _, err = tx.Exec("INSERT INTO users(name) VALUE (?)", "Bob")
    if err != nil {
        panic(err)
    }
    err = tx.Commit()
    if err != nil {
        panic(err)
    }
}

このプログラムでは、操作を開始する前にデータベース接続を開いて作成します。取引。プログラムの実行中に異常なエラーが発生すると、パニックが発生し、プログラム制御フローはただちに無名関数の defer ステートメントの実行に移行します。このステートメントでは、recover 関数を使用してプログラムの通常の実行を復元し、トランザクションのロールバックを実行します。

プログラムが正常に実行されると、トランザクションがコミットされ、データベース接続が閉じられます。異常なエラーが発生すると、エラー メッセージが出力された後にトランザクションがロールバックされ、データベース接続が閉じられ、プログラムが終了します。

4. 概要

defer とcover は Golang の重要なキーワードであり、プログラムで発生する例外エラーを処理するためによく使用されます。 defer キーワードを使用すると、関数の実行後に特別な処理が必要なコードの実行を遅らせることができます。プログラムで異常なエラーが発生した場合、recover キーワードを使用してプログラムの実行を再開し、エラーを処理できます。実際のプログラミングでは、これら 2 つのキーワードを組み合わせて使用​​することで、プログラム内で発生する可能性のある異常事態に対処し、プログラムの安定性と信頼性を確保することができます。

以上がGolang関数でキーワードdeferとrecoverを一緒に使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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