【Go】ファイルの読み込み・書き込み

Categories:Go

Go言語でファイルの読み込み・書き込みをする方法を紹介します。組み込みのosパッケージにあるFileオブジェクトを活用します。

A: 読み込み専用として開く

Goでファイルを扱うには、まずそのファイルをos.File型として取得します。os.Open関数は、名前付きファイルを読み込み専用として開き、os.File型のファイルオブジェクト(あるいはエラーオブジェクト)を返します。

f, err := os.Open("file.txt")

A’: 書き込み権限もつけて開く

ただ内容を読み込むだけでなく、書き込み権限もつけて開きたい時は、os.Create関数が利用できます。名前からして、「新規作成にしか対応してない」ように見える関数ですが、既存のファイルのパスを指定することもできます。より正確には、引数に指定したファイルが存在していない場合はその名前のファイルを作成し、既にファイルがある場合は中身を空にして開きます。先ほどのos.Openと同様に、os.File型のファイルオブジェクト(あるいはエラーオブジェクト)を返します。

f, err := os.Create("write.txt")

B: ファイル内容の読み込み

ここでは、先の1-Aでos.Openを使って開いた”file.txt”の内容をすべて読み込むことを考えます。

This is read by Golang.

この読み込みは、os.File型のReadメソッドを活かして実装できます。

package main

import (
	"fmt"
	"os"
)

func main() {
	// os.Fileオブジェクトの取得(読み込み専用)
	f, err := os.Open("file.txt")
	if err != nil {
		fmt.Printf("os.Open error: %v", err)
	}
	defer func() {
		err := f.Close()
		if err != nil {
			fmt.Printf("closeFileError: %v", err)
		}
	}()

	contents := make([]byte, 1024)
	count, err := f.Read(contents)
	if err != nil {
		fmt.Printf("readFileEroor: %v", err)
	}

	fmt.Printf("===========read %d bytes===========\n", count)
	fmt.Println(string(contents[:count]))
}
# 実行結果
$ go run read_file.go
===========read 24 bytes===========
This is read by Golang.

Readメソッドの引数として与える[]byteスライスのなかに、読み込まれたファイルの内容が格納されます。また、上のコードで変数”count”に代入される一つ目の返り値は、ファイルの内容として何バイト分が読み込まれたかを表すint値です。

C: ファイルへ書き込む

ファイルに情報を書き込むには、os.File型のWriteメソッドを使います。

package main

import (
	"fmt"
	"os"
)

func main() {
	// os.Fileオブジェクトの取得(書き込み権限付き)
	f, err := os.Create("write.txt")
	if err != nil {
		fmt.Printf("os.Create error: %v", err)
	}
	defer func() {
		err := f.Close()
		if err != nil {
			fmt.Printf("closeFileError: %v", err)
		}
	}()

	str := "This is written by Golang."
	contents := []byte(str)
	count, err := f.Write(contents)
	if err != nil {
		fmt.Printf("writeFileError: %v", err)
	}

	fmt.Printf("write %d bytes\n", count)
}
# 実行結果
$ go run write_file.go
write 26 bytes
This is written by Golang.

参考

改訂2版 みんなのGo言語【電子書籍】[ 松木雅幸 ]

返信がありません

コメントを残す

メールアドレスが公開されることはありません。