Tarkibga o'tish

Muhit o‘zgaruvchilari bilan ishlash

Muhit o‘zgaruvchisi (environment variable) — operatsion tizim jarayonga nom va qiymat ko‘rinishida uzatadigan konfiguratsiya. Port, ish rejimi yoki tashqi xizmat manzili kabi qiymatlarni koddan ajratish uchun undan foydalaniladi.

os paketi

Go muhit o‘zgaruvchilarini standart os paketi orqali o‘qiydi. os.Getenv faqat qiymatni qaytaradi. os.LookupEnv esa qiymat bilan birga o‘zgaruvchi mavjudligini ham bildiradi.

package main

import (
    "fmt"
    "os"
)

func main() {
    port, ok := os.LookupEnv("APP_PORT")
    if !ok || port == "" {
        port = "8080"
    }

    fmt.Println("Server porti:", port)
}

PowerShell orqali qiymat berib dasturni ishga tushirish mumkin:

$env:APP_PORT = "9000"
go run main.go
Server porti: 9000

O‘zgaruvchi berilmasa yoki bo‘sh bo‘lsa, dastur 8080 standart qiymatidan foydalanadi. LookupEnv bo‘sh qiymat bilan umuman mavjud bo‘lmagan o‘zgaruvchini ajratish kerak bo‘lgan holatlarda ayniqsa foydali.

Qiymatni tekshirish va turga o‘tkazish

Muhit o‘zgaruvchilarining barchasi matn sifatida keladi. Son kerak bo‘lsa, uni ochiq konvertatsiya qilish va ruxsat etilgan oraliqni tekshirish lozim.

package main

import (
    "fmt"
    "os"
    "strconv"
)

func main() {
    raw := os.Getenv("APP_PORT")
    if raw == "" {
        raw = "8080"
    }

    port, err := strconv.Atoi(raw)
    if err != nil || port < 1 || port > 65535 {
        fmt.Fprintln(os.Stderr, "APP_PORT 1 dan 65535 gacha butun son bo‘lishi kerak")
        os.Exit(1)
    }

    fmt.Printf("Server :%d manzilida ishga tushadi\n", port)
}

Bu tekshiruv abc, 0 yoki 70000 kabi yaroqsiz qiymatlarning server sozlamasiga o‘tib ketishiga yo‘l qo‘ymaydi. Haqiqiy loyihada konfiguratsiyani dastur boshlanishida bir marta o‘qib, tekshirilgan qiymatlarni alohida Config tuzilmasida saqlash qulay.

Qiymat yozish va o‘chirish

os.Setenv joriy jarayon va undan keyin ishga tushirilgan ichki jarayonlar uchun qiymat o‘rnatadi. os.Unsetenv uni olib tashlaydi. Bu chaqiruvlar terminalning yoki operatsion tizimning doimiy sozlamasini o‘zgartirmaydi.

package main

import (
    "fmt"
    "os"
)

func main() {
    if err := os.Setenv("APP_MODE", "development"); err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }

    fmt.Println(os.Getenv("APP_MODE"))

    if err := os.Unsetenv("APP_MODE"); err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
}

.env fayli nima?

.envKEY=value yozuvlarini saqlash uchun ishlatiladigan oddiy matn fayli. U Go yoki operatsion tizimning maxsus formati emas. Go standart kutubxonasi .env faylini avtomatik o‘qimaydi: qiymatlarni shell orqali yuklash yoki maxsus tashqi paketdan foydalanish kerak.

APP_PORT=8080
APP_MODE=development

Warning

Parol, token va API kalitlarini repozitoriyga commit qilmang. .env faylini .gitignorega kiriting, lekin kerakli nomlarni maxfiy qiymatlarsiz .env.example faylida hujjatlashtirish mumkin. Ishlab chiqarish muhitida maxfiy ma’lumotlar boshqaruvchisi (secret manager) afzal.

Keng tarqalgan xatolar

  • os.Getenv qaytargan bo‘sh satrni doim “o‘zgaruvchi yo‘q” deb qabul qilish. Bu farq muhim bo‘lsa, os.LookupEnv ishlating.
  • Son va mantiqiy qiymatlarni tekshirmasdan ishlatish. strconv.Atoi yoki strconv.ParseBool xatosini tekshiring.
  • Maxfiy qiymatni logga chiqarish. Xato xabarida o‘zgaruvchi nomini ko‘rsatish yetarli.
  • Dastur ishlayotgan paytda muhit o‘zgaruvchisi o‘zgarsa, konfiguratsiya avtomatik yangilanadi deb o‘ylash. Jarayon odatda qiymatni ishga tushish vaqtida o‘qiydi.

Xulosa

Muhit o‘zgaruvchilari konfiguratsiyani koddan ajratadi. Go’da ular os.Getenv yoki os.LookupEnv bilan o‘qiladi. Tashqaridan kelgan har qanday konfiguratsiya singari, qiymatni ishlatishdan oldin turini va ruxsat etilgan oralig‘ini tekshirish kerak.