Go 言語 ファイル・I/O 関係のよく使う基本ライブラリ

Go 言語でプログラムを書く際に欠かせないファイルなどの入出力(IO)関係の基本的なライブラリの一覧。この辺のライブラリはかなりよく使うのでパッケージ名や型名を覚えておくといちいちドキュメントを検索せずにすんで良いかも。

目次

備忘用早見表

  • io.Reader

    • 全ての Read 処理の基本となる interface。Read(p []byte) (n int, err error)を持つ。ただ Read を直接扱うことは少ない
  • io.Writer

    • 全ての Write 処理の基本となる interface。Write(p []byte) (n int, err error)を持つ。ただ Write を直接扱うことは少ない
  • os.Open

    • 読み込み用にファイルを開く。*os.File を返す。*os.File は io.Reader, io.Writer として利用できる。
  • os.Create

    • 書き込み用にファイルを開く。*os.File を返す。
  • os.Stdin, os.Stdout, os.Stderr

    • 標準入力、標準出力、標準エラー。*os.File 型
  • bytes.Buffer (struct)

    • ファイルではなくメモリへデータを書き込むのに使う。*bytes.Buffer が io.Writer として利用可能。
  • bytes.Reader (struct)

    • ファイルではなくメモリ([]byte)からデータを読み込むのに使う。*bytes.Reader が io.Reader として利用可能。
  • bufio.Scanner

    • ファイルや標準入力から作られた io.Reader から1行ずつ文字列を読み込む。
  • io/ioutil.ReadAll

    • io.Reader から全てデータを読み込んで[]byte を作成する。string にしたい場合はstring(b)で型変換する。
  • io/ioutil.ReadFile

    • 指定されたファイル名から全てのデータを読み込んで[]byte を作成する。string にしたい場合はstring(b)で型変換する。
  • io/ioutil.WriteFile

    • 指定されたファイル名に[]byte を書き込む。os.Create に合わせるなら第三引数perm0666を渡す。
  • io.Copy

    • io.Reader から io.Writer にデータを全てコピーする便利関数

io.Reader, io.Writer

type Reader interface {
        Read(p []byte) (n int, err error)
}

type Writer interface {
        Write(p []byte) (n int, err error)
}

ファイルの読み書きなど入出力の基本となるインターフェイスです。バイト列([]byte)を読み書きするためのメソッドRead, Writeを提供します。 ファイルや標準入出力、pipe などのデータの読み書きをする関数を定義する場合はio.Readerio.Writerを引数で受け取ります。 ただRead, Writeはとても primitive なメソッドでそのままでは扱いづらいので多くの場合はRead, Writeを直接は呼び出さず、 標準ライブラリに用意されている便利なツールでラップして呼び出すことが多いと思います。 Reader から全ての内容を1つのstringとして読み込んだり、一行ずつ読み込んだり、バッファリングして効率よくファイルに書き込んだりするための標準ライブラリが用意されています。

ファイルを読み書き用に開く

Go でファイルを開く場合

  • ファイルを読み込み用に開く場合はos.Open
  • ファイルを書き込み用に開く場合はos.Create

を使います。どちらの関数も*os.File(と error)を返します。*os.File は Read, Write を実装しているので io.Reader, io.Writer を引数に取る関数に渡すことができます。 ちなみに os パッケージには os.OpenFile という関数も存在しますが、os.OpenFile は os.Open, os.Create の内部で使われる少しプリミティブな関数なので単純にファイルの読み書きをするだけなら普段は os.Open, os.Create を使えば十分です。 Open, Create で開いたファイルは必ずdefer f.Close()を呼び出してファイルを閉じるのを忘れないようにしましょう。

標準入力/標準出力/標準エラー

ファイルの代わりに標準入力, 標準出力, 標準エラーを使いたい場合はos.Stdin, os.Stdout, os.Stderr(いずれも*os.File型)が用意されているのでファイルの代わりにこれを利用します。

メモリからの読み込み・メモリへの書き込み

ファイル入出力などを行う関数のユニットテストを書く場合などに、ファイルの代わりにメモリからデータを読んだり逆にファイルの代わりにメモリにデータを書き込んだりしたい場合があります。Go ではこのような場合にはbytes.Buffer(書き込み用。読み込みも可), bytes.Reader(読み込み専用)を利用します。

Reader, Writer を効率よく使うためのライブラリ

ここからはファイルの読み書き定形処理を行ってくれる便利なライブラリを紹介していきます。 多くのプログラムではRead, Writeを直接使うのではなくRead, Writeをラップしたこれらの便利なライブラリを使ってデータの読み書きします。

bufio.Scanner: 文字列を一行ずつ読み込む

Reader (例えば読み込み用ファイルや標準入力に対応する*os.File) から文字列を一行ずつ読み込むにはbufio.Scannerを利用します。 bufio.NewScanner(func NewScanner(r io.Reader) *Scanner)で io.Reader から*bufio.Scanner を作成し for ループの中でScan()を呼び出して1行ずつファイルを読み込みます。 Text()が返す string には改行文字(\n)は含まれません。 bufio.Scaner の詳しい使い方はこちらを参照して下さい。

bufio.Reader, Writer: バッファリングして効率よく読み書きを行う

Java のBuferredReader, BufferedWriterのようにバッファリングすることで効率的にファイルに対するデータの読み書きを行うライブラリが Go にも用意されています。

"io/ioutil".ReadAll: Reader から全てのデータを一度に読み込む

io/util パッケージのReadAllを使うと io.Reader からデータを全て読み込んで、io.Reader の中身のバイト列([]byte)を作成することができます。

"io/ioutil".ReadFile, WriteFile: ファイル名と byte[]で読み書き

io/util パッケージのReadFile, WriteFileを使って、 指定されたファイル名からファイルの中身を byte[]として読み出す処理と、指定されたファイル名のファイルに byte[]を書き込む処理が簡単に行なえます。

  • func ReadFile(filename string) ([]byte, error)
  • func WriteFile(filename string, data []byte, perm os.FileMode) error

WriteFileにはパーミッションpermを明示的に与えなければなりません。何を指定すればいいか迷ったらとりあえずos.Createに合わせて perm は0666を渡しておけばよいでしょう。

Write([]byte(s)) v.s. WriteString(s)

最終更新: 10/13/2015