Получить домашний каталог пользователя - PullRequest
75 голосов
/ 28 октября 2011

Является ли следующий способ получения домашнего каталога работающего пользователя? Или есть особая функция, которую я выполнил?

os.Getenv("HOME")

Если вышеприведенное верно, кто-нибудь знает, гарантированно ли работает этот подход на платформах, отличных от Linux, например Окна

Ответы [ 7 ]

155 голосов
/ 22 октября 2012

В 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

19 голосов
/ 28 октября 2011

Например,

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)
}
7 голосов
/ 03 апреля 2019

os.UserHomeDir ()

В go1.12 + вы можете использовать os.UserHomeDir ()

home, err := os.UserHomeDir()

См. https://golang.org/pkg/os/#UserHomeDir

Это должно работать дажебез включенного CGO (т.е. FROM scratch) и без необходимости разбора /etc/passwd или другой подобной чепухи.

4 голосов
/ 03 октября 2013

Вот хороший, лаконичный способ сделать это (если вы работаете только в системе на основе UNIX):

import (
  "os"
)

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

Это просто запрашивает переменную окружения $ HOME.

--- Редактировать ---

Теперь я вижу, что этот же метод был предложен выше. Я оставлю этот пример здесь как дистиллированный раствор.

2 голосов
/ 22 января 2017

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)
}
2 голосов
/ 28 октября 2011

Вы должны использовать переменную окружения USERPROFILE или HOMEPATH под Windows. См. Распознаваемые переменные среды (более подходящая ссылка на документацию приветствуется).

1 голос
/ 07 июля 2018

Подобный ответ @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())
}
...