main.goファイルと同階層に「hello」と記載されたsample.txtファイルを作ってみる。

package main

import (
	"log"
	"os"
)

func main() {
	var file *os.File
	_, err := os.Stat("sample.txt")
	if err != nil {
		file, err = os.Create("sample.txt")
		if err != nil {
			log.Fatal(err)
		}
	} else {
		file, err = os.Open("sample.txt")
		if err != nil {
			log.Fatal(err)
		}
	}
	defer file.Close()
	content := []byte("hello")
	file.Write(content)
}

var file *os.FileでosパッケージにあるFile型の変数を指定する。_, err := os.Stat("sample.txt")のos.Statは、main.goファイルと同じ階層にsample.txtがあるかどうかをチェックしている。if err != nil { file, err = os.Create("sample.txt")で、os.Statがもしerrorがあればo.sCreateを実行して、もしerrorがなければos.Openでファイルを開く。

ファイルを作成しても、開いてもdefer file.Close()で一番最後の関数でファイルを閉じる。

content := []byte("hello")でsample.txtファイルに書き込みたいhelloを文字列をbyte列に変換する。file.Write(content)でsample.txtファイルに書き込みを行うとsample.txtファイルに下記のようにhelloが記載される。

次にfolderディレクトリを作り、そこを作業ディレクトリとするコードを記載する。

package main

import (
	"log"
	"os"
	"path/filepath"
)

func main() {
	_, err := os.Stat("folder")
	if err != nil {
		err = os.Mkdir("folder", 0755)
		if err != nil {
			log.Fatal(err)
		}
	}

	currentDir, err := filepath.Abs(".")
	if err != nil {
		log.Fatal(err)
	}

	err = os.Chdir(currentDir + "/folder")
	if err != nil {
		log.Fatal(err)
	}

	var file *os.File
	_, err = os.Stat("sample.txt")
	if err != nil {
		file, err = os.Create("sample.txt")
		if err != nil {
			log.Fatal(err)
		}
	} else {
		file, err = os.Open("sample.txt")
		if err != nil {
			log.Fatal(err)
		}
	}
	defer file.Close()
	content := []byte("hello")
	file.Write(content)
}

_, err := os.Stat("folder")でmain.goファイルと同じ階層にfolderがあるかチェックする。ディレクトリがなければ、Mkdir("folder", 0755)でフォルダを作成する。currentDir, err := filepath.Abs(".")でmain.goが格納されているディレクトリを調べる。err = os.Chdir(currentDir + "/folder")でappディレクトリの下にあるfolderディレクトリに作業ディレクトリを変更する。後は、上記と同じようにsample.txtにコードを記載して、file.Write(content)で書き込むと上記と同じhelloが表示される。

フォルダとファイルは、下の画像のように生成される。