Kullanıcının giriş dizinini al

Çalışan kullanıcının ana dizini elde etmenin en iyi yolu aşağıda mı? Ya da ben eğlendim belirli bir işlevi var mı?

os.Getenv("HOME")

Yukarıdakiler doğruysa, bu yaklaşımın Linux dışı platformlarda, örneğin Windows®

64
$ HOME , kullanıcının giriş dizini zorunlu değil . Örneğin, programınızı başlatmadan önce dışa aktarma HOME =/bir şey/else yazabilirim. Genellikle bu, /something/else 'i bir sebepten dolayı ev dizinim olarak kullanmam için istediğim anlamına gelir ve genellikle program bunu kabul etmelidir. Ancak, kullanıcının gerçek ana dizinine gerçekten ihtiyacınız varsa, bir ortam değişkeni mutlaka size vermez.
katma yazar Keith Thompson, kaynak
@KeithThompson Teşekkürler ama amaçlarım için yeterince iyi.
katma yazar Paul Ruane, kaynak

6 cevap

Git 1.0.3'te (muhtemelen daha önce de) aşağıdaki işler:

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
katma
Sadece ben mi yoksa Windows'da bunu yapmanın birkaç saniye sürdüğü tek ben miyim?
katma yazar Htbaa, kaynak
Harika, çok teşekkürler. Bu değişiklikten habersizdi. Tam olarak aradığım şey bu.
katma yazar Paul Ruane, kaynak
Mac sürümleri 1.0.3, 32- ve 64-bit sürümleri kullanılarak Mac OS 10.6.8'de çalışır.
katma yazar George, kaynak
1.1'den itibaren, "usr, err: = user.Current ()", bir "kullanıcı: Current, darwin/amd64 üzerinde uygulanmadı" hatası verir.
katma yazar Oleiade, kaynak
katma yazar Vishnu, kaynak
Windows 7 64bit VM'imde kesinlikle görünüyor.
katma yazar Vlad Didenko, kaynak

Örneğin,

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
katma
Bu, şu andaki tek yol gibi görünen Jeremy W Sherman ile aynı yaklaşımdır. Çok teşekkürler.
katma yazar Paul Ruane, kaynak
Bu, viper util.go'da izlenen yaklaşımdır. userHomeDir()
katma yazar ecerulm, kaynak

Windows altındaki USERPROFILE veya HOMEPATH ortam değişkenini kullanmalısınız. Tanınan Ortam Değişkenleri bölümüne bakın. bağlantı memnuniyetle karşılanacaktır).

2
katma
@PaulRuane Platformlar farklı değişkenler kullandığından, işletim sistemini görmezden gelmek, her iki değişkeni de kontrol etmek ve hangisi daha düşükse ile gitmek. Her ikisi de tanımlanmışsa, HOME kullanırdım, çünkü bu muhtemelen cygwin altında çalışıyor demektir.
katma yazar Jeremy W. Sherman, kaynak
Teşekkürler. Öyleyse, EV'in her platform için Go tarafından doldurulmadığını mı söylüyorsunuz (doğrudan O/S env varslarına aktarır) ve ana dizini tanımlamak için her bir platformun ilgili değişkenini kontrol etmeliyim?
katma yazar Paul Ruane, kaynak
Kaynağa baktım ve göründüğü gibi HOME otomatik olarak doldurulmuyor. Ev dizinini almak için (şu anda) hiçbir platform agnostik tesis yok gibi görünüyor.
katma yazar Paul Ruane, kaynak

İşte bunu yapmak için güzel, özlü bir yol (sadece UNIX tabanlı bir sistemde çalışıyorsanız):

import (
  "os"
)

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

Bu sadece $ HOME ortam değişkenini sorgular.

--- Düzenle ---

Şimdi aynı yöntemin yukarıda önerildiğini görüyorum. Bu örneği burada damıtılmış bir çözüm olarak bırakacağım.

2
katma
1. Daha önce önerildi, 2. çapraz platform değil, 3. kabul edilen cevap zaten bu problemi daha iyi çözüyor.
katma yazar Paul Ruane, kaynak

Benzer bir yanıtı @PeterSO ama linux için XDG_CONFIG_HOME yoluna saygı duyar.

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
katma

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

Aşağıdaki kod, defaultGOPATH işlevinden ayıklanır.

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
katma
Bu Go işlevinin uygulanması ilginç olsa da, bu kabul edilen yanıtta açıklanan standart kitaplık işlevini kullanmaktan daha kötü bir çözümdür. (Ve PeterSO'nun altı yıl önceki cevabı ile aynı yaklaşım.)
katma yazar Paul Ruane, kaynak