Подтвердить что ты не робот

Получить домашний каталог пользователя

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

os.Getenv("HOME")

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

4b9b3361

Ответ 1

В 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

Ответ 2

Например,

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

Ответ 4

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

import (
  "os"
)

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

Это просто запрашивает переменную среды $HOME.

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

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

Ответ 5

go1.8rc2 имеет функцию go/build/defaultGOPATH, которая получает домашний каталог. https://github.com/golang/go/blob/go1.8rc2/src/go/build/build.go#L260-L277

Следующий код извлекается из функцииGOPATH по умолчанию.

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