106

以下是获取正在运行的用户主目录的最佳方法吗?还是有我忽略的特定功能?

os.Getenv("HOME")

如果以上是正确的,有没有人碰巧知道这种方法是否可以保证在非 Linux 平台上工作,例如 Windows?

4

7 回答 7

209

从 go 1.12 开始推荐的方法是:

package main
import (
    "os"
    "fmt"
    "log"
)
func main() {
    dirname, err := os.UserHomeDir()
    if err != nil {
        log.Fatal( err )
    }
    fmt.Println( dirname )
}

老推荐:

在 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 )
}
于 2012-10-22T03:50:44.710 回答
78

os.UserHomeDir()

在 go1.12+ 中,您可以使用 os.UserHomeDir()

home, err := os.UserHomeDir()

https://golang.org/pkg/os/#UserHomeDir

FROM scratch即使没有启用 CGO(即)并且无需解析/etc/passwd或其他此类废话,这也应该可以工作。

于 2019-04-03T09:15:18.570 回答
23

例如,

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)
}
于 2011-10-27T22:01:23.783 回答
4

这是一个很好、简洁的方法(如果您只在基于 UNIX 的系统上运行):

import (
  "os"
)

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

那只是查询 $HOME 环境变量。

- - 编辑 - -

我现在看到上面提出了同样的方法。我将把这个例子留在这里作为一个蒸馏解决方案。

于 2013-10-03T18:27:45.937 回答
4

与@peterSO 类似的答案,但尊重XDG_CONFIG_HOMElinux 的路径。

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())
}
于 2018-07-06T21:19:19.797 回答
2

您应该使用环境变量USERPROFILEHOMEPATH在 Windows 下。请参阅公认的环境变量(欢迎提供更合适的文档链接)。

于 2011-10-27T21:06:41.287 回答
2

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)
}
于 2017-01-22T01:34:04.297 回答