ファイルの読み書き

Go言語における「ファイルの読み書き」は、標準ライブラリ os および io/ioutil(Go 1.16以降は主に osioosos.ReadFile, os.WriteFile など)を用いて行います。以下に、ファイルの読み込み、書き込み、それぞれの基本的な方法と注意点を詳しく説明します。


1. ファイルの読み込み

方法1:os.ReadFile を使った全読み込み(Go 1.16以降)

go
package main import ( "fmt" "os" ) func main() { data, err := os.ReadFile("sample.txt") if err != nil { fmt.Println("読み込みエラー:", err) return } fmt.Println(string(data)) }

特徴

  • ファイル全体を一度にメモリへ読み込む。

  • 小〜中規模ファイルに適している。

  • エラーハンドリングが必要。


方法2:os.Open + bufio.Scanner で1行ずつ読み込み

go
package main import ( "bufio" "fmt" "os" ) func main() { file, err := os.Open("sample.txt") if err != nil { fmt.Println("ファイルを開けません:", err) return } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Println("読み込み中にエラーが発生:", err) } }

特徴

  • メモリ効率が良い。

  • 大きなファイルの読み取りに向いている。


2. ファイルへの書き込み

方法1:os.WriteFile で一括書き込み(Go 1.16以降)

go
package main import ( "os" ) func main() { data := []byte("これは書き込まれるテキストです。") err := os.WriteFile("output.txt", data, 0644) if err != nil { panic(err) } }

特徴

  • ファイルを新規作成または上書きする。

  • 第3引数はパーミッション(例: 0644 は読み書き可の一般的な設定)。


方法2:os.Create + Write / WriteString

go
package main import ( "fmt" "os" ) func main() { file, err := os.Create("output.txt") if err != nil { fmt.Println("ファイル作成エラー:", err) return } defer file.Close() _, err = file.WriteString("1行目のテキスト\n") if err != nil { fmt.Println("書き込みエラー:", err) } }

特徴

  • os.Create はファイルを新規作成(既存なら上書き)。

  • Write, WriteString, fmt.Fprintln などの出力関数が利用可能。


方法3:追記モードで書き込み(os.OpenFile

go
package main import ( "os" ) func main() { file, err := os.OpenFile("output.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { panic(err) } defer file.Close() file.WriteString("新しい行を追記します。\n") }

特徴

  • os.O_APPEND で追記、os.O_CREATE で存在しない場合に新規作成。

  • ログファイルや継続的な出力に便利。


3. 注意点

  • ファイル操作時は 必ず defer file.Close() を使用してリソースを解放

  • os.Open は読み取り専用、os.Create は上書き用、os.OpenFile は柔軟なフラグ設定が可能。

  • ファイルの文字コードは UTF-8 が前提。異なるエンコーディングの読み書きには追加ライブラリが必要。


まとめ

操作 推奨関数(Go 1.16以降) 特徴
読み込み os.ReadFile, bufio.Scanner 小〜大ファイル、全体 or 逐次読取対応
書き込み os.WriteFile, os.Create 上書き、または追記モード選択可能
追記 os.OpenFile フラグを組み合わせて柔軟に制御可能

Goにおけるファイル操作は、エラーハンドリングとリソース管理(ファイルのクローズ)が重要なポイントです。ファイルのサイズや用途に応じて適切な読み書き方法を選びましょう。

生成日:2025/05/03