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が表示される。

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