0Pricing
Go Academy · レッスン

ファイルと一時ファイルへの書き込み

WriteFile、OpenFileのフラグ、一時ファイル

「ファイルと一時ファイルへの書き込み」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

os.WriteFile

os.WriteFile はバイトスライスをファイルにアトミックに書き込みます(切り詰めてから書き込みます)。小さなファイルに適したシンプルな方法です。

err := os.WriteFile("output.txt", []byte("hello"), 0644)
if err != nil { log.Fatal(err) }

os.Create と defer Close

os.Create はファイルを作成または切り詰め、*os.File を返します。必ず defer でクローズしてください。

f, err := os.Create("output.txt")
if err != nil { return err }
defer f.Close()
f.WriteString("hello\n")

フラグを指定した os.OpenFile

追記、存在しない場合のみ作成、排他的な作成モードには os.OpenFile を使用します。

f, err := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)

bufio.Writer

ファイルを bufio.NewWriter でラップすると、小さな書き込みをまとめて大きなシステムコールにできます。バッファ内のデータを書き込むため、クローズする前に Flush() を呼び出してください。

w := bufio.NewWriter(f)
fmt.Fprintf(w, "line %d\n", i)
w.Flush()

fmt.Fprintf

ファイルを含む任意の io.Writer に、書式付きテキストを書き込みます。

fmt.Fprintf(f, "name: %s, age: %d\n", name, age)

アトミックなファイル書き込みパターン

一時ファイルに書き込んでから、保存先へリネームします。POSIX ではリネームがアトミックなため、読み取り側には古いファイルか新しいファイルのどちらか一方だけが見え、書き込み途中の内容が見えることはありません。

tmp, _ := os.CreateTemp("", "output-*.txt")
tmp.Write(data)
tmp.Close()
os.Rename(tmp.Name(), "output.txt")

os.CreateTemp

os.CreateTemp(dir, pattern) は、pattern に一致する一意な名前で、dir 内に一時ファイルを作成します。開いた状態のファイルを返します。削除は呼び出し側の責任です。

f, err := os.CreateTemp("", "upload-*.json")
defer os.Remove(f.Name()) // cleanup

os.MkdirTemp

os.MkdirTemp は一時ディレクトリを作成します。テスト用フィクスチャや、複数の一時ファイルを作成する処理パイプラインに使用します。

dir, err := os.MkdirTemp("", "batch-*")
defer os.RemoveAll(dir)

ファイルのアクセス権

Create 系の関数の最後の引数には、Unix のアクセス権ビットを渡します(たとえば 0644 は所有者に rw、グループとその他のユーザーに r を与えます)。プロセスの umask によって、さらに制限される場合があります。

書き込みエラーの確認

f.WriteString と fmt.Fprintf は、ディスク容量不足や権限不足などによってエラーを返すことがあります。エラーを確認するか、最初のエラーを記録する writer ラッパーを使ってエラーを蓄積してください。

sync.File は並行安全ではない

複数の goroutine から同じ *os.File に同時に書き込むと、書き込みが入り混じる可能性があります。ミューテックスまたは専用の writer goroutine を 1 つ使用してください。

クイックチェック

一時ファイルに書き込んでからリネームするパターンがアトミックと見なされるのはなぜですか。

まとめ: ファイルの書き込み

要点:

  • os.WriteFile: シンプルな上書き、bufio.Writer: 小さな書き込みのバッチ処理に使用します
  • アトミックな書き込み: 一時ファイル + リネーム
  • 一時リソースには os.CreateTemp / os.MkdirTemp を使用し、必ず defer でクリーンアップします
  • 書き込みエラーを確認し、並行する書き込みを同期します

よくある質問

「ファイルと一時ファイルへの書き込み」レッスンは無料ですか?

はい。「ファイルと一時ファイルへの書き込み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「ファイルと一時ファイルへの書き込み」で何を学びますか?

WriteFile、OpenFileのフラグ、一時ファイル ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ファイルと一時ファイルへの書き込み」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. osとbufioによるファイル読み込み
  2. ファイルと一時ファイルへの書き込み
  3. JSONのエンコードとデコード
  4. JSONとCSVのストリーミング
← Go Academyに戻る