実行中のユーザーのホームディレクトリを取得する最良の方法は次のとおりですか?または、私が見た特定の機能はありますか?
os.Getenv("HOME")
上記が正しい場合、このアプローチが非Linuxプラットフォームで動作することが保証されているかどうかを誰かが知っていますか? Windows?
Go 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 )
}
クロスコンパイルが重要な場合は、 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)
}
Go1.12 +では、os.UserHomeDir()を使用できます
home, err := os.UserHomeDir()
https://golang.org/pkg/os/#UserHomeDir を参照してください
これは、CGOが有効になっていなくても(つまり、FROM scratch
)、/etc/passwd
などのナンセンスを解析しなくても機能するはずです。
これを行うための素敵で簡潔な方法を次に示します(UNIXベースのシステムでのみ実行している場合)。
import (
"os"
)
var home string = os.Getenv("HOME")
これは、$ HOME環境変数を照会するだけです。
---編集---
この同じ方法が上で提案されたことがわかりました。この例を蒸留溶液として残します。
@peterSOへの同様の答えですが、XDG_CONFIG_HOME
Linuxのパス。
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には、ホームディレクトリを取得するgo/build/defaultGOPATH関数があります。 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)
}
Windowsでは、環境変数USERPROFILE
またはHOMEPATH
を使用する必要があります。 認識された環境変数 を参照してください(より適切なドキュメントリンクを歓迎します)。