検索
ホームページバックエンド開発GolangGo言語の遅延実行ステートメントとは何ですか

Go言語の遅延実行ステートメントとは何ですか

Jan 11, 2023 pm 06:28 PM
golang言語を移動defer

Go 言語では、遅延実行ステートメントは defer ステートメントであり、構文は「defer any statement」です。 defer ステートメントは、それに続くステートメントの処理を遅らせます。defer が属する関数が戻ろうとすると、遅延されたステートメントは defer とは逆の順序で実行されます。つまり、最初に遅延されたステートメントが実行されます。最後に実行され、最後に延期されたステートメントが実行されます。ステートメントが最初に実行されます。

Go言語の遅延実行ステートメントとは何ですか

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

Go 言語の遅延実行ステートメント (defer ステートメント)

Go 言語には遅延実行ステートメントがあり、これは defer によって制御されます。キーワードロゴ。

defer キーワードは、それに続くステートメントの処理を遅らせます。defer が属する関数が戻ろうとしているとき、遅延処理ステートメントは defer とは逆の順序で実行されます。 is defer first 最後に実行されるステートメントであり、最後の defer ステートメントが最初に実行されます。

形式は次のとおりです:

defer 任意语句

defer の後のステートメントはすぐには実行されません。defer が属する関数が戻ろうとすると、関数本体内のすべての defer ステートメントが実行されます。実行、つまり関数本体の最後の defer ステートメントが最初に実行されます。

package main

import "fmt"

func main(){
	fmt.Println("start now")
	defer fmt.Println("这是第一句defer语句")
	defer fmt.Println("这是第二句defer语句")
	defer fmt.Println("这是第三句defer语句")
	fmt.Println("end")
}

実行結果は次のとおりです。

start now
end
这是第三句defer语句
这是第二句defer语句
这是第一句defer语句

defer 文は現在の関数が返ろうとしたときに呼び出されるため、リソースの解放には defer がよく使用されます。

複数の遅延実行ステートメントの処理順序

複数の遅延動作が登録されている場合、それらは逆の順序 (スタックと同様、つまり最後に実行される) で実行されます。 in, first out) の場合、次のコードは、次に示すように、一連の数値 print ステートメントの処理を順番に遅延させます。

package main
import (
    "fmt"
)
func main() {
    fmt.Println("defer begin")
    // 将defer放入延迟调用栈
    defer fmt.Println(1)
    defer fmt.Println(2)
    // 最后一个放入, 位于栈顶, 最先调用
    defer fmt.Println(3)
    fmt.Println("defer end")
}

コード出力は次のとおりです。

defer begin
defer end
3
2
1

結果分析は次のとおりです。

  • コードの遅延順序は、最終的な実行順序とは逆になります。

  • 遅延呼び出しは、defer が配置されている関数が終了したときに実行されます。関数の終了は、関数が正常に戻ったとき、またはダウンタイムが発生したときになります。

遅延実行ステートメントを使用して、関数の終了時にリソースを解放します。

ビジネスやロジックでペアの操作を扱うのは面倒です。オープニングのようなものファイルを閉じる、リクエストの受信と応答、ロックとロック解除など。これらの操作の中で最も見落とされやすいのは、各関数の終了時にリソースを正しく解放して閉じることです。

defer ステートメントは、まさに関数の終了時に実行されるステートメントであるため、defer を使用すると、リソース解放の問題を非常に簡単に処理できます。

1) 遅延同時ロック解除を使用する

次の例では、map が関数内で同時に使用されます。競合状態を防ぐために、ロックに sync.Mutex が使用されます。次のコードを参照してください。

var (
    // 一个演示用的映射
    valueByKey      = make(map[string]int)
    // 保证使用映射时的并发安全的互斥锁
    valueByKeyGuard sync.Mutex
)
// 根据键读取值
func readValue(key string) int {
    // 对共享资源加锁
    valueByKeyGuard.Lock()
    // 取值
    v := valueByKey[key]
    // 对共享资源解锁
    valueByKeyGuard.Unlock()
    // 返回值
    return v
}

コードの説明は次のとおりです:

  • 行 3 はマップをインスタンス化します。キーは文字列型で、値は int です。

  • 行 5、マップはデフォルトでは同時実行安全ではありません。マップ アクセスを保護するために sync.Mutex ミューテックスを準備します。

  • 行 9、readValue() 関数はキーを与え、マップから値を取得した後に値を返します。この関数は同時環境で使用され、同時実行の安全性を確保する必要があります。 。

  • 行 11、ミューテックスを使用してロックします。

  • 13行目、マップから値を取得します。

  • #15 行目、ミューテックスを使用してロックを解除します。

  • 17行目は取得したマップ値を返します。

defer ステートメントを使用して上記のステートメントを簡素化します。以下のコードを参照してください。

func readValue(key string) int {
    valueByKeyGuard.Lock()
   
    // defer后面的语句不会马上调用, 而是延迟到函数结束时调用
    defer valueByKeyGuard.Unlock()
    return valueByKey[key]
}

上記のコードの 6 ~ 8 行目は、前のコードへの変更と追加です。コードの説明は次のとおりです:

  • 6 行目はミューテックス After にあります。ロックする場合は、defer ステートメントを使用してロック解除を追加します。このステートメントはすぐには実行されませんが、readValue() 関数が返されたときに実行されます。

  • 8行目、マップから値を問い合わせて返す処理はミューテックスを使わない場合の書き方と同じです。のほうが簡単です。

2) ファイル ハンドルの遅延リリースの使用

ファイルの操作には、ファイルを開く、ファイル リソースの取得と操作、リソースを閉じるといういくつかのプロセスが必要です。操作が完了した後、ファイルリソースがクローズされていない場合、プロセスはファイルリソースを解放することができません. 次の例では、ファイル名に基づいてファイルサイズを取得する関数が実装されます。ファイルを開く、ファイル サイズを取得する、ファイルを閉じるなどの操作が必要です。各システム操作にはエラー処理が必要であり、処理の各ステップで終了の可能性が生じるため、終了時にリソースを解放する必要があります。関数の終了時にファイル リソースを正しく解放することに細心の注意を払う必要があります。次のコードを参照してください:

// 根据文件名查询其大小
func fileSize(filename string) int64 {
    // 根据文件名打开文件, 返回文件句柄和错误
    f, err := os.Open(filename)
    // 如果打开时发生错误, 返回文件大小为0
    if err != nil {
        return 0
    }
    // 取文件状态信息
    info, err := f.Stat()
   
    // 如果获取信息时发生错误, 关闭文件并返回文件大小为0
    if err != nil {
        f.Close()
        return 0
    }
    // 取文件大小
    size := info.Size()
    // 关闭文件
    f.Close()
   
    // 返回文件大小
    return size
}

コードの説明は次のとおりです:

  • 行 2 は次の内容を定義します。ファイル サイズを取得する関数。戻り値は 64 ビットのファイル サイズ値です。

  • 5行目、OSパッケージが提供する関数Open()を使用して、指定されたファイル名に基づいてファイルを開き、ファイルの操作に使用されたハンドルと操作エラーを返します。 。

  • 8行目、ファイルが見つからない、ファイルが占有されているなど、オープン処理中にエラーが発生した場合、ファイルサイズは0として返されます。

  • 第 13 行,此时文件句柄 f 可以正常使用,使用 f 的方法 Stat() 来获取文件的信息,获取信息时,可能也会发生错误。

  • 第 16~19 行对错误进行处理,此时文件是正常打开的,为了释放资源,必须要调用 f 的 Close() 方法来关闭文件,否则会发生资源泄露。

  • 第 22 行,获取文件大小。

  • 第 25 行,关闭文件、释放资源。

  • 第 28 行,返回获取到的文件大小。

在上面的例子中,第 25 行是对文件的关闭操作,下面使用 defer 对代码进行简化,代码如下:

func fileSize(filename string) int64 {
    f, err := os.Open(filename)
    if err != nil {
        return 0
    }
    // 延迟调用Close, 此时Close不会被调用
    defer f.Close()
    info, err := f.Stat()
    if err != nil {
        // defer机制触发, 调用Close关闭文件
        return 0
    }
    size := info.Size()
    // defer机制触发, 调用Close关闭文件
    return size
}

代码中加粗部分为对比前面代码而修改的部分,代码说明如下:

  • 第 10 行,在文件正常打开后,使用 defer,将 f.Close() 延迟调用,注意,不能将这一句代码放在第 4 行空行处,一旦文件打开错误,f 将为空,在延迟语句触发时,将触发宕机错误。

  • 第 16 行和第 22 行,defer 后的语句(f.Close())将会在函数返回前被调用,自动释放资源。

【相关推荐:Go视频教程编程教学

以上がGo言語の遅延実行ステートメントとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

GolangとPythonの主な違いは、並行性モデル、タイプシステム、パフォーマンス、実行速度です。 1. GolangはCSPモデルを使用します。これは、同時タスクの高いタスクに適しています。 Pythonは、I/O集約型タスクに適したマルチスレッドとGILに依存しています。 2。Golangは静的なタイプで、Pythonは動的なタイプです。 3.ゴーランコンパイルされた言語実行速度は高速であり、Python解釈言語開発は高速です。

Golang vs. C:速度差の評価Golang vs. C:速度差の評価Apr 18, 2025 am 12:20 AM

Golangは通常Cよりも遅くなりますが、Golangはプログラミングと開発効率の同時により多くの利点があります。1)Golangのゴミ収集と並行性モデルにより、同時性の高いシナリオではうまく機能します。 2)Cは、手動のメモリ管理とハードウェアの最適化により、より高いパフォーマンスを取得しますが、開発の複雑さが高くなります。

Golang:クラウドコンピューティングとDevOpsのキー言語Golang:クラウドコンピューティングとDevOpsのキー言語Apr 18, 2025 am 12:18 AM

GolangはクラウドコンピューティングとDevOpsで広く使用されており、その利点はシンプルさ、効率性、および同時プログラミング機能にあります。 1)クラウドコンピューティングでは、GolangはGoroutineおよびチャネルメカニズムを介して同時リクエストを効率的に処理します。 2)DevOpsでは、Golangの高速コンピレーションとクロスプラットフォーム機能により、自動化ツールの最初の選択肢になります。

Golang and C:実行効率の理解Golang and C:実行効率の理解Apr 18, 2025 am 12:16 AM

GolangとCにはそれぞれ、パフォーマンス効率に独自の利点があります。 1)GolangはGoroutineおよびGarbage Collectionを通じて効率を向上させますが、一時停止時間を導入する場合があります。 2)Cは、手動のメモリ管理と最適化を通じて高性能を実現しますが、開発者はメモリリークやその他の問題に対処する必要があります。選択するときは、プロジェクトの要件とチームテクノロジースタックを考慮する必要があります。

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は簡潔な構文とリッチライブラリエコシステムで知られています。

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ヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 Mac版

SublimeText3 Mac版

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

メモ帳++7.3.1

メモ帳++7.3.1

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