Атрымаць хатні каталог карыстальніка

Ці з'яўляецца наступнае лепшым спосабам атрымання хатняга каталога які бег карыстальніка? Ці ёсць пэўная функцыя, якую я ovelooked?

os.Getenv("HOME")

Калі вышэй дакладна, то ці хто-небудзь здараецца ведаць, гарантаванае Ці гэты падыход да працы на платформах, выдатных ад Linux, напрыклад Вокны?

64
<Код> $ HOME не <я> абавязкова у хатнім каталогу карыстальніка. Напрыклад, я магу напісаць экспарт HOME =/то/іншае перад запускам праграмы. Звычайна гэта азначае, што I <я> хачу праграма для лячэння /нешта/іншае у якасці хатняга каталога для нейкай прычыне, і, як правіла, праграма павінна прыняць. Але калі вам сапраўды патрэбен карыстальнік рэальна хатняга каталога, зменная асяроддзі не абавязкова даваць яго вам.
дададзена аўтар Keith Thompson, крыніца
@KeithThompson Дзякуй, але для маіх мэтаў гэта дастаткова добра.
дададзена аўтар Paul Ruane, крыніца

6 адказы

У ходзе 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 )
}

If it is important to cross-compile, consider the homedir library

134
дададзена
Гэта толькі мяне, ці я адзіны, дзе рабіць гэта на Windows, займае некалькі секунд?
дададзена аўтар Htbaa, крыніца
Высокае, вялікі дзякуй. Не ведаў пра гэта змене. Гэта менавіта тое, што я шукаў.
дададзена аўтар Paul Ruane, крыніца
Яна працуе на Mac OS 10.6.8, выкарыстоўваючы Go версію, як старую, як 1.0.3, 32- і 64-бітныя.
дададзена аўтар George, крыніца
Майце на ўвазе, што, як гоу 1.1, «USR, эээ: = user.Current ()» кіне «карыстальніка: ток не рэалізаваны на/Дарвіне amd64» памылка на OSX.
дададзена аўтар Oleiade, крыніца
не працуе, калі крыж складзены code.google.com/p/go/пытанні/дэталі? ID = 6376
дададзена аўтар Vishnu, крыніца
Гэта вызначана здаецца імгненным на маім Windows 7 64bit VM.
дададзена аўтар Vlad Didenko, крыніца

Напрыклад,

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)
}
13
дададзена
Гэта такі ж падыход, як Джэрэмі W Sherman, які, здаецца, адзіны спосаб у цяперашні час. Вялікі дзякуй.
дададзена аўтар Paul Ruane, крыніца
Такі падыход накіроўваўся ў гадзюкі util.go userHomeDir()

Вы павінны выкарыстоўваць зменныя асяроддзі USERPROFILE або HOMEPATH пад Windows. См Прызнаўшы зменныя асяроддзі (больш ДАРЭЧЫ дакументацыі спасылка будзе вітацца).

2
дададзена
@PaulRuane Паколькі платформы выкарыстоўваюць розныя зменныя, проста ігнараваць АС, праверыць абедзве зменныя, і ісці з якой бы заселеная. Калі абодва вызначаны, я хацеў бы выкарыстаць HOME , так што, верагодна, азначае, што вы працуеце пад Cygwin.
дададзена аўтар Jeremy W. Sherman, крыніца
Дзякуючы. А вы кажаце, то, што дом не заселены Go для кожнай платформы (што ён дэлегуе непасрэдна ў акр O/S VARS), і я павінен праверыць адпаведную зменную для кожнай платформы, каб вызначыць хатні каталог?
дададзена аўтар Paul Ruane, крыніца
Я меў погляд на крыніцу і з'яўляецца HOME не запаўняецца аўтаматычна. Здаецца, што няма (на дадзены момант) не залежыць ад платформы сродкі для атрымання хатняга каталога.
дададзена аўтар Paul Ruane, крыніца

Вось добры, лаканічны спосаб зрабіць гэта (калі вы толькі працуе на сістэме на аснове UNIX):

import (
  "os"
)

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

Гэта проста запытвае зменную $ HOME асяроддзя.

--- Edit ---

Цяпер я бачу, што гэты ж метад быў прапанаваны вышэй. Я пакіну гэты прыклад тут, як дыстыляваная раствор.

2
дададзена
1. гэта было прапанавана раней, 2. гэта не крос-платформавы, 3. прыняты адказ ужо вырашае гэтую праблему лепш.
дададзена аўтар Paul Ruane, крыніца

Падобны адказ @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())
}
1
дададзена

go1.8rc2 has the go/build/defaultGOPATH function which gets the home directory. 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)
}
1
дададзена
Хоць рэалізацыя гэтай функцыі Go цікава, гэта горш, чым рашэнне з выкарыстаннем стандартнай бібліятэчнай функцыі, апісанай у прынятым адказе. (І гэта той жа падыход, як адказ peterSO ў ад шасці гадоў таму.)
дададзена аўтар Paul Ruane, крыніца