以下是获取正在运行的用户主目录的最佳方法吗?或者我有一个特定的功能吗?
os.Getenv("HOME")
如果上述情况正确,是否有人碰巧知道这种方法是否可以保证在非Linux平台上运行,例如视窗?
答案 0 :(得分:151)
在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 )
}
如果交叉编译很重要,请考虑the homedir
library
答案 1 :(得分:19)
例如,
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)
}
答案 2 :(得分:6)
在go1.12 +中,您可以使用os.UserHomeDir()
home, err := os.UserHomeDir()
请参见https://golang.org/pkg/os/#UserHomeDir
即使在未启用CGO(即FROM scratch
)并且无需解析/etc/passwd
或其他此类废话的情况下,这也应能工作。
答案 3 :(得分:4)
这是一个很好的,简洁的方法(如果你只在基于UNIX的系统上运行):
import (
"os"
)
var home string = os.Getenv("HOME")
只查询$ HOME环境变量。
---编辑---
我现在看到上面提出了同样的方法。我将这个例子作为一种蒸馏溶液留在这里。
答案 4 :(得分:2)
您应该在Windows下使用环境变量USERPROFILE
或HOMEPATH
。请参阅Recognized Environment Variables(欢迎更多apropos文档链接。)
答案 5 :(得分: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)
}
答案 6 :(得分:1)
@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())
}