Go by Example: Temporary Files and Directories

プログラムの実行中に、終了後は必要がなくなるデータを 作りたくなることがよくあります。 一時ファイルと一時ディレクトリ は、ファイルシステムを 汚さないので、そのために使えます。

package main
import (
    "fmt"
    "os"
    "path/filepath"
)
func check(e error) {
    if e != nil {
        panic(e)
    }
}
func main() {

一時ファイルを作成する最も簡単な方法は、os.CreateTemp を実行することです。これは、ファイルを作成し、かつ 読み書きのためにオープンします。この例では、os.CreateTemp が OS デフォルトの場所にファイルを作成するよう 第1引数に "" を指定しています。

    f, err := os.CreateTemp("", "sample")
    check(err)

一時ファイルの名前を表示します。Unix ベースの OS では、 ディレクトリは /tmp のようになるでしょう。 ファイル名は、os.CreateTemp の第2引数で指定された 接頭辞から始まり、残りの部分は並列呼び出しされても常に 異なる名前になるよう自動的に決定されます。

    fmt.Println("Temp file name:", f.Name())

ファイルを後始末します。OS は一時ファイルを適当なタイミングで 削除してくれることが多いですが、明示的に実行する方がよいです。

    defer os.Remove(f.Name())

ファイルにデータを書き出すこともできます。

    _, err = f.Write([]byte{1, 2, 3, 4})
    check(err)

多くの一時ファイルに書き出すことを想定している場合、 一時 ディレクトリ を作った方がよいかもしれません。 os.MkdirTemp の引数は CreateTemp と同じですが、 ファイルを開く代わりにディレクトリの 名前 を返します。

    dname, err := os.MkdirTemp("", "sampledir")
    check(err)
    fmt.Println("Temp dir name:", dname)
    defer os.RemoveAll(dname)

この一時ディレクトリを使って、一時ファイルの名前を 合成できます。

    fname := filepath.Join(dname, "file1")
    err = os.WriteFile(fname, []byte{1, 2}, 0666)
    check(err)
}
$ go run temporary-files-and-directories.go
Temp file name: /tmp/sample610887201
Temp dir name: /tmp/sampledir898854668

Next example: Testing and Benchmarking.