ホームページ >バックエンド開発 >Golang >golang ファイルを閉じる

golang ファイルを閉じる

WBOY
WBOYオリジナル
2023-05-16 10:47:07684ブラウズ

Golang でプログラミングするときは、通常、ファイルを開いて読み書きする必要があります。ただし、同時に、システム リソースを解放するために、ファイルの使用が終了したらファイルを確実に閉じる必要もあります。そこで、この記事ではGolangでファイルを閉じる方法を紹介します。

ファイルを閉じることの重要性

Golang では、os.Open() 関数を使用してファイルを開き、os.Create()## を使用します。 # 関数は新しいファイルを作成できます。これらの関数は、*File 型のインスタンスを返します。使い終わったら、file.Close() 関数を使用してファイルを閉じてシステム リソースを解放する必要があります。そうしないと、ファイル記述子がリークし、最終的にシステム リソース全体が消費されてしまいます。

たとえば、次の例では、ファイルを開いてそのすべての行を反復処理します。

file, err := os.Open("example.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

scanner := bufio.NewScanner(file)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}

if err := scanner.Err(); err != nil {
    log.Fatal(err)
}

ここでは

defer ステートメントが使用されていることに注意してください。関数で使用されます。戻る前に file.Close() メソッドを自動的に実行します。こうすることで、関数内でエラーが発生した場合でもファイルが正しく閉じられるようになります。

ファイル終了エラー

file.Close()メソッドを使用してファイルを閉じることができます。ただし、ファイルを閉じるときに失敗する場合があります。たとえば、次のコードでは、存在しないファイルを意図的に開きます。

file, err := os.Open("does_not_exist.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

ファイルが存在しないため、ファイルを開くときにエラーが返されます。この場合、

file.Close() によって別のエラーがトリガーされ、閉じるのが失敗します。この場合、ファイルを閉じる前にエラーを確認する必要があります。例:

file, err := os.Open("does_not_exist.txt")
if err != nil {
    log.Fatal(err)
}
defer func() {
    if err := file.Close(); err != nil {
        log.Fatal(err)
    }
}()

ここでは、無名関数を使用し、ファイルを閉じる操作をこの関数に配置します。関数の実行中に、ファイルを閉じるときにエラーが発生したかどうかを再度確認します。シャットダウンが失敗した場合は、

log.Fatal() 関数を呼び出してエラーを記録し、プログラムを終了します。

os.File.Close() の基礎となる実装

基礎となる実装では、ファイルを閉じることは、

close() システムを呼び出すオペレーティング システムの呼び出しにすぎません。ファイル記述子を閉じる関数。 Golang では、os.File 型は io.Closer インターフェイスを実装します。このインターフェイスにはメソッドが 1 つだけあります: os.File の

type Closer interface {
    Close() error
}

Close() 関数は実際には単に syscall.Close() 関数を呼び出します。

func (file *File) Close() error {
    if file == nil {
        return syscall.EINVAL
    }
    if file == os.Stdin || file == os.Stdout || file == os.Stderr {
        return nil
    }
    return file.file.close()
}

Close() 関数はいくつかの特別な条件もチェックすることに注意してください。たとえば、filenil または特別な標準入力出力である可能性があります。ストリーム。このような場合、シャットダウン操作では実際のアクションは実行されません。

defer によってリソースを閉じる

ファイルを開くときに

defer キーワードを使用することをお勧めします。こうすることで、関数が戻る前にエラーが発生した場合でもファイルを確実に閉じることができます。たとえば、次のコードは、ファイルを読み取った後、ファイルを自動的に閉じます。

file, err := os.Open("example.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

// 读取文件

defer ステートメントの実行順序は「後入れ先出し」であるため、関数の前の任意の時点で実行されます。が返されると、ファイルが閉じられていることを確認できます。

結論

Golang では、

os.Open() 関数を使用してファイルを開き、file.Close() メソッドを使用します。ファイルを閉じてリソースを解放します。ファイルを閉じるときにエラーを確認し、ログに記録する必要があります。さらに、defer キーワードを使用すると、ファイルが使用および操作されるときに、ファイルが常に適切に閉じられるようになります。

以上がgolang ファイルを閉じるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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