获取用户的主目录

Pau*_*ane 81 go home-directory

以下是获取正在运行的用户主目录的最佳方法吗?或者我有一个特定的功能吗?

os.Getenv("HOME")
Run Code Online (Sandbox Code Playgroud)

如果以上是正确的,那么是否有人知道这种方法是否可以保证在非Linux平台上运行,例如Windows?

Vla*_*nko 159

在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 )
}
Run Code Online (Sandbox Code Playgroud)

如果是交叉编译重要的是,考虑homedir图书馆

  • 在交叉编译https://code.google.com/p/go/issues/detail?id=6376时不起作用 (10认同)
  • 请注意,从1.1开始,"usr,err:= user.Current()"将在osx上抛出"用户:当前未在darwin/amd64上实现"错误. (4认同)
  • 请不要使用这个,而是使用``os.UserHomeDir()```,因为它考虑了用户的环境变量和 XDG 基本目录规范!详情请参阅下面的答案。 (4认同)

Coo*_*J86 26

os.UserHomeDir()

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

home, err := os.UserHomeDir()
Run Code Online (Sandbox Code Playgroud)

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

即使未启用CGO(即FROM scratch),也无需解析/etc/passwd或其他类似的废话,该方法也可以工作。


pet*_*rSO 20

例如,

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)
}
Run Code Online (Sandbox Code Playgroud)

  • 这是viper util.go [userHomeDir()](https://github.com/spf13/viper/blob/80ab6657f9ec7e5761f6603320d3d58dfe6970f6/util.go#L144-L153)中遵循的方法 (2认同)