以下是获取正在运行的用户主目录的最佳方法吗?还是有我忽略的特定功能?
os.Getenv("HOME")
如果以上是正确的,有没有人碰巧知道这种方法是否可以保证在非 Linux 平台上工作,例如 Windows?
以下是获取正在运行的用户主目录的最佳方法吗?还是有我忽略的特定功能?
os.Getenv("HOME")
如果以上是正确的,有没有人碰巧知道这种方法是否可以保证在非 Linux 平台上工作,例如 Windows?
从 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 )
}
在 go1.12+ 中,您可以使用 os.UserHomeDir()
home, err := os.UserHomeDir()
见https://golang.org/pkg/os/#UserHomeDir
FROM scratch
即使没有启用 CGO(即)并且无需解析/etc/passwd
或其他此类废话,这也应该可以工作。
例如,
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)
}
这是一个很好、简洁的方法(如果您只在基于 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())
}
您应该使用环境变量USERPROFILE
或HOMEPATH
在 Windows 下。请参阅公认的环境变量(欢迎提供更合适的文档链接)。
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)
}