Foydalanuvchining uy katalogini olish

Ishlaydigan foydalanuvchining uy katalogini olishning eng yaxshi yo'li quyidagilardan iboratmi? Yoki men o'zim ovlanadigan muayyan vazifam bormi?

os.Getenv("HOME")

Agar yuqorida ko'rsatilgan bo'lsa, bu yondashuv Linuxdan tashqari platformalarda ishlashga kafolatlanganmi, masalan. Windows?

64
$ HOME foydalanuvchining uy katalogini mutlaqo emas. Masalan, dasturni ishga tushirishdan oldin export HOME =/something/else ni yozishim mumkin. Odatda bu mening dasturiyamni /something/else ni davolash uchun dasturini istaganini anglatadi va odatda dastur buni qabul qilishi kerak. Lekin agar foydalanuvchining haqiqiy asosiy katalogiga muhtoj bo'lsangiz, atrof-muhit o'zgaruvchisi uni sizlarga berishi shart emas.
qo'shib qo'ydi muallif Keith Thompson, manba
@KeithThompson Tashakkur, lekin mening maqsadlarim uchun bu yaxshi.
qo'shib qo'ydi muallif Paul Ruane, manba

6 javoblar

1.0.3 da (ehtimol, avvalroq ham) quyidagi ishlar amalga oshiriladi:

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
qo'shib qo'ydi
Windows-da bu ishni bir necha soniya ushlab turadigan yagonagina menmi yoki menmi?
qo'shib qo'ydi muallif Htbaa, manba
Ajoyib, ko'p rahmat. Ushbu o'zgarishdan bexabar edi. Bu men izlayotgan narsadir.
qo'shib qo'ydi muallif Paul Ruane, manba
Mac OS 10.6.8 versiyasida Go versiyalari 1.0.3, 32- va 64-bit kabi eski versiyalarda ishlaydi.
qo'shib qo'ydi muallif George, manba
1.1 ga binoan, "usr, err: = user.Current ()" osxda "foydalanuvchi: joriy darvin/amd64da xatolik" deb ataladi.
qo'shib qo'ydi muallif Oleiade, manba
o'zaro bog'langan holda ishlamaydi code.google.com/p/go/issues/detail? id = 6376
qo'shib qo'ydi muallif Vishnu, manba
Bu, albatta, Windows 7 64bit VM-da bir zumda ko'rinadi.
qo'shib qo'ydi muallif Vlad Didenko, manba

Misol uchun,

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
qo'shib qo'ydi
Jeremy V Sherman kabi hozirgi yagona yondashuv. Ko'p rahmat.
qo'shib qo'ydi muallif Paul Ruane, manba
Bu utf.go saytida kuzatilgan yondashuv userHomeDir()
qo'shib qo'ydi muallif ecerulm, manba

Windows ostida muhit o'zgaruvchisini USERPROFILE yoki HOMEPATH dan foydalaning. Taniqli muhit o'zgaruvchilar (batafsilroq ma'lumot bog'lanish mamnuniyat bilan qabul qilinadi).

2
qo'shib qo'ydi
@PaulRuane Platformalar turli xil parametrlardan foydalanganligi sababli, operatsion tizimni e'tiborsiz qoldirib, ikkala parametrni ham tekshirib chiqing va qaysi biri bilan to'ldirilsin. Har ikkisi ham tavsiflangan bo'lsa, HOME dan foydalanishim mumkin, chunki bu cygwin ostida ishlayotganingizni bildiradi.
qo'shib qo'ydi muallif Jeremy W. Sherman, manba
Rahmat. Siz har bir platformaga (u to'g'ridan-to'g'ri O/S env vars) delegatsiya uchun GO'ning joylashuvi joylashmaganligini va uy katalogini aniqlash uchun har bir platformaning o'zgaruvchisini tekshirishim kerakligini aytdingizmi?
qo'shib qo'ydi muallif Paul Ruane, manba
Men manbaga qaray boshladim va u avtomatik ravishda joylashtirilmaydi. Uy katalogini olish uchun hozirgi kunda (hech qanday platforma agostikasi mavjud emas) ko'rinadi.
qo'shib qo'ydi muallif Paul Ruane, manba

Buni amalga oshirish uchun yaxshi, ixcham usul (agar siz faqat UNIX tizimida ishlayotgan bo'lsangiz):

import (
  "os"
)

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

Faqatgina $ HOME muhit o'zgaruvchisini so'raydi.

--- Tartibga solish ---

Endi men yuqorida aytib o'tilgan usulni ko'rib chiqayapman. Ushbu misolni distillangan eritma sifatida qoldiraman.

2
qo'shib qo'ydi
1. ilgari tavsiya etilgan, 2. bu o'zaro faoliyat platforma emas, 3. qabul qilingan javob bu masalani yaxshiroq hal qiladi.
qo'shib qo'ydi muallif Paul Ruane, manba

@PeterSO ga o'xshash javob, lekin Linux uchun XDG_CONFIG_HOME yo'lini hurmat qiladi.

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
qo'shib qo'ydi

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

Quyidagi kod defaultGOPATH funksiyasidan olinadi.

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
qo'shib qo'ydi
Ushbu Go funktsiyasini amalga oshirish qiziqarli bo'lsa-da, bu qabul qilingan javobda tasvirlangan standart kutubxona vazifasini ishlatishdan ko'ra yomonroqdir. (Va olti yil oldin peterSOning javobiga o'xshash yondashuv.)
qo'shib qo'ydi muallif Paul Ruane, manba