ホームディレクトリが必要になるのは、コマンドラインツールとかを作っていて、設定ファイルを保存するようなケースです。
Goにはos/userパッケージがあって、一見これを使うのがセオリーのように見えるのですが、クロスコンパイルするとエラーになります。
package main
import (
"fmt"
"os/user"
)
func main() {
fmt.Println(user.Current())
}
これは、私の手元のOSX環境では動きますが、Go Playgroundでは以下のようにエラーになります。
<nil> user: Current not implemented on nacl/amd64p32
Program exited.
他にも、例えばTravis CI(Ubuntu Linux)でビルドしたバイナリをOSXやWindowsで動かすと、以下のようなエラーになりました。
panic: user: Current not implemented on darwin/amd64
goroutine 1 [running]:
(中略)
main.main()
/home/travis/gopath/src/github.com/hironobu-s/******/main.go:47 +0x71b
goroutine 2 [runnable]:
runtime.forcegchelper()
/home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/proc.go:90
runtime.goexit()
/home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/asm_amd64.s:2232 +0x1
goroutine 3 [runnable]:
runtime.bgsweep()
/home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/mgc0.go:82
runtime.goexit()
/home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/asm_amd64.s:2232 +0x1
goroutine 4 [runnable]:
runtime.runfinq()
/home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/malloc.go:712
runtime.goexit()
/home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/asm_amd64.s:2232 +0x1
これはos/userパッケージがcgoに依存していて、Goでクロスコンパイルするとcgoが無効になっているからだそうです。私もあまり詳しくわかっていませんが、以下の解説を参考にしました。
Issue 6376: user.Current panic in darwin-amd64 when crosscompiled from linux-amd64
go - Cross compiling: "user: Current not implemented on linux/amd64" - Stack Overflow
そして、ホームディレクトリを取得するのには、こちらのパッケージを使わせてもらうことにしました。ありがたや。
https://github.com/mitchellh/go-homedir