Obtain user's home directory

以下是获取运行用户主目录的最佳方法吗?还是有一个我已经看过的特定函数?

os.Getenv("HOME")

如果上面的说法是正确的,是否有人碰巧知道这种方法是否能够保证在非 Linux 平台(例如 Windows)上运行?

76146 次浏览

你应在视窗下使用环境变量 USERPROFILEHOMEPATH。请参阅 认可环境变数(欢迎更恰当的文档链接)。

For example,

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)
}

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

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

老建议:

在 go1.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 )
}

这里有一个不错的、简洁的方法(如果您只是在基于 UNIX 的系统上运行的话) :

import (
"os"
)


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

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

- 编辑

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

Go1.8 rc2具有 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)
}

类似于@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())
}

OS. UserHomeDir ()

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

home, err := os.UserHomeDir()

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

即使没有启用 CGO (即 FROM scratch) ,也不需要解析 /etc/passwd或其他类似的废话,这种方法也应该能够工作。