実行中のユーザーのホームディレクトリを取得するには、以下の方法が最適ですか?それとも、私が習熟した特定の機能がありますか?
os.Getenv("HOME")
上記が正しい場合、このアプローチがLinux以外のプラットフォームでも動作することが保証されているかどうかは誰にでも分かります。 Windows?
$ HOME
export HOME =/something/else
/something/else
1.0.3(おそらく以前のバージョン)では、次のような作業が行われました。
package main import ( "os/user" "fmt" "log" ) func main() { usr, err := user.Current() if err != nil { log.Fatal( err ) } fmt.Println( usr.HomeDir ) }
If it is important to cross-compile, consider the homedir library
homedir
例えば、
package main import ( "fmt" "os" "runtime" ) func UserHomeDir() string { if runtime.GOOS == "windows" { home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") if home == "" { home = os.Getenv("USERPROFILE") } return home } return os.Getenv("HOME") } func main() { dir := UserHomeDir() fmt.Println(dir) }
Windows環境変数 USERPROFILE または HOMEPATH を使用する必要があります。 認識された環境変数を参照してください。リンクは歓迎されるだろう)。
USERPROFILE
HOMEPATH
HOME
これを行うためのすてきで簡潔な方法があります(UNIXベースのシステムでのみ実行している場合)。
import ( "os" ) var home string = os.Getenv("HOME")
これは$ HOME環境変数を照会するだけです。
---編集---
私は今、この同じ方法が上に示唆されていることを見ています。この例を蒸留した解決策としてここに残します。
@peterSOに似ていますが、linuxの XDG_CONFIG_HOME のパスを尊重します。
XDG_CONFIG_HOME
package main import ( "fmt" "os" "runtime" ) func userHomeDir() string { if runtime.GOOS == "windows" { home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") if home == "" { home = os.Getenv("USERPROFILE") } return home } else if runtime.GOOS == "linux" { home := os.Getenv("XDG_CONFIG_HOME") if home != "" { return home } } return os.Getenv("HOME") } func main() { fmt.Println(userHomeDir()) }
go1.8rc2 has the go/build/defaultGOPATH function which gets the home directory. https://github.com/golang/go/blob/go1.8rc2/src/go/build/build.go#L260-L277
次のコードは、defaultGOPATH関数から抽出されています。
package main import ( "fmt" "os" "runtime" ) func UserHomeDir() string { env := "HOME" if runtime.GOOS == "windows" { env = "USERPROFILE" } else if runtime.GOOS == "plan9" { env = "home" } return os.Getenv(env) } func main() { dir := UserHomeDir() fmt.Println(dir) }