2011-10-27 48 views
59

以下是獲取正在運行的用戶主目錄的最佳方式嗎?或者是否有我開發的特定功能?獲取用戶的主目錄

os.Getenv("HOME") 

如果上述內容是正確的,是否有人知道這種方法是否可以在非Linux平臺上工作,例如,視窗?

+2

'$ HOME'不一定是用戶的主目錄。例如,我可以在啓動程序之前編寫'export HOME =/something/else'。通常這意味着我*希望*程序將'/ something/else'作爲我的主目錄出於某種原因,通常程序應該接受這個。但是如果你確實需要用戶的* actual * home目錄,那麼一個環境變量不一定會給你。 –

+1

@KeithThompson謝謝,但對我的目的來說,這已經足夠了。 –

回答

120

在去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

非常棒,非常感謝。不知道這個變化。這正是我所期待的。 –

+0

這只是我或我是唯一一個在Windows上做這件事需要幾秒鐘? – Htbaa

+0

這絕對是我的Windows 7 64位虛擬機上的瞬間。 –

2

您應該在Windows下使用環境變量USERPROFILEHOMEPATH。請參閱Recognized Environment Variables(歡迎使用更多apropos文檔鏈接)。

+0

謝謝。那麼,您是否說過,對於每個平臺(它直接委託給O/S環境變量),Go沒有填充HOME,我必須檢查每個平臺的相應變量以確定主目錄? –

+0

我看了一下源代碼,看起來HOME並沒有自動填充。似乎有(當前)沒有平臺不可知的設施獲取主目錄。 –

+0

@PaulRuane由於平臺使用不同的變量,只需忽略操作系統,檢查兩個變量,並與填充的任何一個。如果兩者都定義了,我會使用'HOME',因爲這可能意味着你在cygwin下運行。 –

10

例如,

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

這與Jeremy W Sherman相似,似乎是目前唯一的方法。非常感謝。 –

+0

這是viper util.go [userHomeDir()](https://github.com/spf13/viper/blob/80ab6657f9ec7e5761f6603320d3d58dfe6970f6/util.go#L144-L153) – ecerulm

2

下面是一個很好的,簡潔的方法來做到這一點(如果你只在基於UNIX的系統上運行):

import (
    "os" 
) 

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

這只是查詢$ HOME環境變量。

---編輯---

我現在看到,上面提出了同樣的方法。我將在這裏將這個例子作爲一個解決方案。

+1

1.之前已經提出過它,2.它不是跨平臺的,3.已經接受的答案 –

1

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

雖然這個Go函數的實現很有趣,但這是一個比使用接受的答案中描述的標準庫函數更糟糕的解決方案(和peterSO在六年前的答案一樣。 ) –