ユーザーのホームディレクトリを取得する

実行中のユーザーのホームディレクトリを取得するには、以下の方法が最適ですか?それとも、私が習熟した特定の機能がありますか?

os.Getenv("HOME")

上記が正しい場合、このアプローチがLinux以外のプラットフォームでも動作することが保証されているかどうかは誰にでも分かります。 Windows?

64
$ HOME は、必ずしもユーザのホームディレクトリではありません。たとえば、プログラムを起動する前に export HOME =/something/else と書くことができます。通常は、何らかの理由でプログラムが/something/else をホームディレクトリとして扱いたいと思っています。通常はプログラムがそれを受け入れるべきです。しかし、本当にユーザの実際のホームディレクトリが必要な場合、環境変数は必ずしもあなたにそれを与えるわけではありません。
追加された 著者 Keith Thompson,
@KeithThompsonありがとう、しかし私の目的のためには十分です。
追加された 著者 Paul Ruane,

6 答え

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

134
追加された
それは私だけですか、私はWindows上でこれを行う数秒かかる唯一の人ですか?
追加された 著者 Htbaa,
素晴らしい、多くのありがとう。この変更を知らなかった。これはまさに私が探していたものです。
追加された 著者 Paul Ruane,
これはMac OS 10.6.8で動作します.Goバージョンは1.0.3,32、および64ビットほど古いバージョンです。
追加された 著者 George,
1.1の時点で、 "usr、err:= user.Current()"はosxの "user:Current not implemented on darwin/amd64"エラーをスローします。
追加された 著者 Oleiade,
クロスコンパイル時に動作しません code.google.com/p/go/issues/detail?id = 6376
追加された 著者 Vishnu,
間違いなく私のWindows 7 64bit VMでは瞬時に見えます。
追加された 著者 Vlad Didenko,

例えば、

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)
}
13
追加された
これは現在の唯一の方法であると思われるJeremy W Shermanと同じアプローチです。どうもありがとう。
追加された 著者 Paul Ruane,
これは、viper util.goに続くアプローチです。 userHomeDir()
追加された 著者 ecerulm,

Windows環境変数 USERPROFILE または HOMEPATH を使用する必要があります。 認識された環境変数を参照してください。リンクは歓迎されるだろう)。

2
追加された
@PaulRuaneプラットフォームはさまざまな変数を使用しているため、OSを無視して両方の変数をチェックし、いずれかの変数をチェックします。両方が定義されている場合は、 HOME を使用します。これはおそらく、cygwinで動作している可能性があるためです。
追加された 著者 Jeremy W. Sherman,
ありがとう。ホームには各プラットフォームのGoが実装されていません(O/S環境に直接委任します)。ホームディレクトリを識別するために各プラットフォームのそれぞれの変数をチェックする必要がありますか?
追加された 著者 Paul Ruane,
私はソースを見てきましたが、HOMEには自動的に入力されていないようです。ホームディレクトリを取得するためのプラットフォームに依存しない機能が(現在)存在しないようです。
追加された 著者 Paul Ruane,

これを行うためのすてきで簡潔な方法があります(UNIXベースのシステムでのみ実行している場合)。

import (
  "os"
)

var home string = os.Getenv("HOME")

これは$ HOME環境変数を照会するだけです。

---編集---

私は今、この同じ方法が上に示唆されていることを見ています。この例を蒸留した解決策としてここに残します。

2
追加された
1.それは前に提案されている、2.クロスプラットフォームではない、3.受け入れられた答えはすでにこの問題をより良い方法で解決する。
追加された 著者 Paul Ruane,

@peterSOに似ていますが、linuxの 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())
}
1
追加された

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)
}
1
追加された
このGo関数の実装は面白いですが、これは受け入れられた答えに記述されている標準ライブラリ関数を使用するよりも悪い解決策です。 (そして6年前からの答えは同じです。)
追加された 著者 Paul Ruane,