go-homedir はもう要らない

Shimane.go#03 の LT に

というのがあって,これは GitHub の公開リポジトリから go.mod ファイルを探して使われているパッケージを数え上げてランキングにするという非常に面白い内容だったのだが,この中で mitchellh/go-homedir が割と使われているのが気になったので,記事にしてみる。

mitchellh/go-homedir はプラットフォーム非依存でユーザのホーム・ディレクトリを取得するパッケージである。

もともとホーム・ディレクトリを取得する手段として

package main

import (
	"fmt"
	"os"
	"os/user"
)

func main() {
	u, err := user.Current()
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
        return
	}
	fmt.Println(u.HomeDir)
}

みたいな感じで標準の os/user パッケージが用意されているが,このパッケージは pure Go ではないためユーザの間で微妙に評判が悪いのだ。 この不満を解消する手段として pure Go 実装である mitchellh/go-homedir が使われ続けた経緯がある。

しかし,実は Go 1.12 から os.UserHomeDir() 関数が pure Go で実装されたため上述のパッケージは(少なくともホーム・ディレクトリを取得する手段としては)不要になった。

こんな感じ。

package main

import (
	"fmt"
	"os"
)

func main() {
	home, err := os.UserHomeDir()
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
        return
	}
	fmt.Println(home)
}

もし mitchellh/go-homedir パッケージを使っているなら os.UserHomeDir() 関数で代替できないか検討することをオススメしたい。

設定ファイル格納ディレクトリの取得

ところで,『改訂2版 みんなのGo言語』の2.8章では設定ファイルの置き場所について解説されている。 特に UNIX 系のプラットフォームでは XDG Base Directory の仕様に準拠した構成が求められることが多い。 たとえば my-app の設定ファイル config.json

$HOME/.config/my-app/config.json

に置く,という感じ。

Go 1.13 では os.UserConfigDir() 関数が追加され,設定ファイルのパスの組み立てが簡単になった。 『改訂2版 みんなのGo言語』で書かれているような条件分けは,もはや不要である。

こんな感じ。

package main

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

func main() {
	conf, err := os.UserConfigDir()
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
	}
	fmt.Println(filepath.Join(conf, "my-app", "config.json"))
}

ちなみに,このコードを “The Go Playground” 上で実行すると

neither $XDG_CONFIG_HOME nor $HOME are defined

と怒られる(笑)

というわけで, Go 言語は日々進歩してるんだよ,というお話でした。

ブックマーク

参考図書

photo
プログラミング言語Go
アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)
丸善出版 2016-06-20 (Release 2021-07-13)
Kindle版
B099928SJD (ASIN)
評価     

Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想はこちら

reviewed by Spiegel on 2021-05-22 (powered by PA-APIv5)

photo
改訂2版 みんなのGo言語
松木 雅幸 (著), mattn (著), 藤原 俊一郎 (著), 中島 大一 (著), 上田 拓也 (著), 牧 大輔 (著), 鈴木 健太 (著)
技術評論社 2019-08-01 (Release 2019-08-01)
Kindle版
B07VPSXF6N (ASIN)
評価     

改訂2版の目玉は7章の「データベースの扱い方」が追加されたことだろう。他の章では,大まかな構成は1版と同じだが細かい部分が変わっていて Go 1.12 への言及まであるのには驚いた。

reviewed by Spiegel on 2019-08-12 (powered by PA-APIv5)