Go言語を用いたファイル操作: 実践的な使い方と最適なパターンについて解説

Go

この記事ではGo言語におけるファイル操作の基本から高度な使い方までを詳細に解説します。Goの標準ライブラリである”os”と”io/ioutil”パッケージを使用した基本的なファイル読み書きから、エラーハンドリング、ファイルパスの操作方法、そしてディレクトリの操作まで、多岐にわたります。

流行りに乗ってGo言語を使ってみた(インストールからHelloWorld表示まで)

流行りに乗ってGo言語を使ってみた(インストールからHelloWorld表示まで)
Go言語とは 2009年、GoogleでRobert Griesemer、ロブ・パイク、ケン・トンプソンによって設計された。Goは、静的型付け、C言語の伝統に則ったコンパイル言語、メモリ安全性、ガベージコレクション、構造的型付け(英語版)、...

Go言語の基本的なファイル操作

Go言語はファイル操作を容易にするためのパッケージを標準ライブラリとして提供しています。具体的には、”os”と”io/ioutil”パッケージです。これらを使うことで、ファイルの読み書き、ファイルの情報取得、ファイルの削除といった基本的な操作が可能になります。

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	data := []byte("Hello, World!\n")
	
	// ファイル書き込み
	ioutil.WriteFile("./hello", data, 0644)

	// ファイル読み込み
	readData, _ := ioutil.ReadFile("/tmp/hello")
	fmt.Print(string(readData))
}

このコードを実行すると、以下の出力結果が得られます。

また、main.goファイルの場所にhelloというファイルが作成され、Hello, World!と入力されています

Hello, World!

ファイルの詳細情報取得とエラーハンドリング

上記の基本的な例では、エラーハンドリングは省略されています。実際のプログラムではエラーハンドリングをきちんと行うことが重要です。また、ファイルの詳細な情報を取得することも可能です。”os”パッケージのStat関数を使用すると、ファイルサイズ、修正日、パーミッションなどの情報を取得できます。

package main

import (
	"fmt"
	"os"
)

func main() {
	// ファイルの情報取得
	fileInfo, err := os.Stat("./hello")
	if err != nil {
		fmt.Println("File does not exist.")
		return
	}

	fmt.Println("File name:", fileInfo.Name())
	fmt.Println("Size in bytes:", fileInfo.Size())
	fmt.Println("Permissions:", fileInfo.Mode())
	fmt.Println("Last modified:", fileInfo.ModTime())
	fmt.Println("Is Directory: ", fileInfo.IsDir())
}

実行結果は下記のようになり、ファイルの情報が出力されます

File name: hello
Size in bytes: 14
Permissions: -rw-r--r--
Last modified: 2023-05-18 14:03:45.123456789 +0900 JST
Is Directory:  false

ファイルパスの操作

Goでは”filepath”パッケージを用いて、ファイルパスの操作が可能です。”Join”関数を使用してパスを構築したり、”Base”や”Dir”を使用してパスからファイル名やディレクトリ名を抽出できます。

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	path := filepath.Join("./test", "hello.txt")
	fmt.Println("Path:", path)

	base := filepath.Base(path)
	fmt.Println("Base:", base)

	dir := filepath.Dir(path)
	fmt.Println("Dir:", dir)

	ext := filepath.Ext(path)
	fmt.Println("Ext:", ext)
}

実行結果:

Path: /test/hello.txt
Base: hello.txt
Dir: /test
Ext: .txt

ディレクトリの操作

Go言語ではディレクトリの作成や読み込みも簡単に行うことができます。ディレクトリの作成には”os”パッケージの”Mkdir”や”MkdirAll”関数を、ディレクトリの内容の読み取りには”ioutil”パッケージの”ReadDir”関数を使用します。

package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	os.Mkdir("./test/newdir", 0755)

	files, _ := ioutil.ReadDir("/test")
	for _, file := range files {
		fmt.Println(file.Name())
	}
}

実行結果(”/tmp”ディレクトリの内容が表示され、”newdir”が含まれています):

hello 
newdir

まとめ

以上、Go言語を用いたファイル操作の基本的な方法から少し高度な使い方までを紹介しました。これらの知識を活用し、Go言語のポテンシャルを最大限に引き出しましょう。

Go言語公式ドキュメンテーションでは、今回解説した以外の多くの詳細情報が提供されています。