以下是获取运行用户主目录的最佳方法吗?还是有我看过的特定功能?
os.Getenv("HOME")
如果上述正确,那么是否有人知道这种方法是否可以保证在非Linux平台(例如Windows)上运行?
以下是获取运行用户主目录的最佳方法吗?还是有我看过的特定功能?
os.Getenv("HOME")
如果上述正确,那么是否有人知道这种方法是否可以保证在非Linux平台(例如Windows)上运行?
Answers:
在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 )
}
如果交叉编译很重要,请考虑使用homedir
库
在go1.12 +中,您可以使用os.UserHomeDir()
home, err := os.UserHomeDir()
参见https://golang.org/pkg/os/#UserHomeDir
即使未启用CGO(即FROM scratch
),也不必解析/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)
}
USERPROFILE
是用户在系统上存储空间的根,但不是应将应用程序写入保存对话框提示之外的地方。如果您有应用程序配置,则应将其写入APPDATA
;如果您有应用程序缓存(或不应通过网络同步的大文件),则应LOCALAPPDATA
在Windows上将其写入。
这是一种很好的简洁方法(如果您仅在基于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())
}
APPDATA
用于配置和LOCALAPPDATA
用于大文件。对于一般用途的“家”,我建议LOCALAPPDATA
这样做,因此默认情况下,应用程序开发人员不会破坏公司网络。😊
您应该使用环境变量USERPROFILE
或HOMEPATH
在Windows下使用。请参阅公认的环境变量(欢迎访问更多apropos文档链接)。
HOME
,因为这可能意味着您正在cygwin下运行。
USERPROFILE
或HOMEPATH
在绝大多数情况下,在Windows上。在几乎所有使用开发人员的情况下,开发人员应该使用APPDATA
还是LOCALAPPDATA
(取决于内容在登录/注销时通过网络同步的合理性)。
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)
}
APPDATA
或者LOCALAPPDATA
几乎总是正确的选择,而不是USERPROFILE
。
$HOME
并不一定是用户的主目录。例如,我可以export HOME=/something/else
在启动程序之前编写。通常,这意味着出于某种原因,我希望程序将其/something/else
视为主目录,并且程序通常应该接受它。但是,如果您确实需要用户的实际主目录,则不一定要使用环境变量。