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

このエントリーをはてなブックマークに追加

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

宣伝

Goをインタラクティブに実行できるJupyter Notebook環境を作ったので興味があったら試してみて下さい。

備忘用早見表

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.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[]を書き込む処理が簡単に行なえます。

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

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

このエントリーをはてなブックマークに追加
Home