57 / 68

os

os paketi

os — dasturning operatsion tizim bilan bevosita muloqotini ta'minlaydi: buyruq qatori argumentlarini o'qish, muhit o'zgaruvchilari (environment variables) bilan ishlash, fayl yaratish/o'qish/o'chirish va dasturni to'xtatish kabi imkoniyatlarni beradi.

example.go
import "os"

1. Buyruq qatori argumentlari: os.Args

Dastur terminal orqali qanday argumentlar bilan ishga tushirilganini bilish uchun os.Args ishlatiladi:

example.go
package main

import (
    "fmt"
    "os"
)

func main() {
    // os.Args[0] — dastur nomining o'zi, qolganlari — unga berilgan argumentlar
    fmt.Println(os.Args)
}

Masalan, dasturni go run main.go ali 25 deb ishga tushirsangiz:

Natija:

kod
[/tmp/.../main ali 25]

os.Args[1] — "ali", os.Args[2] — "25" bo'ladi.


2. Muhit o'zgaruvchilari: Getenv(), Setenv(), LookupEnv()

Muhit o'zgaruvchilari — dastur tashqarisida (masalan, server sozlamalarida) belgilanadigan va dastur ichidan o'qib olinadigan qiymatlar (masalan, ma'lumotlar bazasi manzili, API kaliti):

example.go
package main

import (
    "fmt"
    "os"
)

func main() {
    // odatda muhit o'zgaruvchisi tashqaridan (terminal, server) belgilanadi,
    // biz esa ko'rsatish uchun dastur ichida o'zimiz o'rnatib qo'yamiz
    os.Setenv("MY_VAR", "salom")

    val := os.Getenv("MY_VAR")
    fmt.Println(val)

    // agar o'zgaruvchi mavjud emasligini ham bilish kerak bo'lsa:
    val2, ok := os.LookupEnv("YOQ_BOLGAN_VAR")
    fmt.Println(val2, ok)
}

Natija:

kod
salom
 false

[!IMPORTANT] os.Getenv() agar o'zgaruvchi mavjud bo'lmasa, shunchaki bo'sh satr qaytaradi — bu esa "o'zgaruvchi mavjud, lekin qiymati bo'sh" holatidan farqlanmaydi! Agar bu farq muhim bo'lsa (masalan, majburiy sozlama borligini tekshirish uchun), os.LookupEnv()dan foydalaning — u qo'shimcha ravishda bool qiymat (ok) ham qaytaradi.


3. Faylga yozish va undan o'qish: WriteFile() va ReadFile()

Kichik fayllar bilan ishlashning eng qisqa yo'li — butun faylni bir yo'la yozish yoki o'qish:

example.go
package main

import (
    "fmt"
    "os"
)

func main() {
    // faylga yozamiz (0644 — fayl ruxsatlari)
    err := os.WriteFile("salom.txt", []byte("Salom, fayl!"), 0644)
    if err != nil {
        fmt.Println("Xatolik:", err)
        return
    }

    // fayldan o'qiymiz
    data, err := os.ReadFile("salom.txt")
    if err != nil {
        fmt.Println("Xatolik:", err)
        return
    }

    fmt.Println(string(data))
}

Natija:

kod
Salom, fayl!

[!NOTE] Katta hajmdagi fayllar (masalan, bir necha gigabaytli loglar) uchun ReadFile()/WriteFile() butun faylni birdaniga xotiraga yuklaydi — bu noqulay bo'lishi mumkin. Bunday hollarda oqim (stream) asosida ishlaydigan os.Open()/os.Create() + bufio paketidan foydalanish tavsiya etiladi — bu haqda keyingi darsda gaplashamiz.


4. Fayl haqida ma'lumot olish: os.Stat()

example.go
package main

import (
    "fmt"
    "os"
)

func main() {
    info, err := os.Stat("salom.txt")
    if err != nil {
        fmt.Println("Xatolik:", err)
        return
    }

    fmt.Println("Nomi:", info.Name())
    fmt.Println("Hajmi (bayt):", info.Size())
}

Natija:

kod
Nomi: salom.txt
Hajmi (bayt): 12

Fayl mavjud yoki yo'qligini tekshirish uchun ko'pincha shu funksiya os.IsNotExist() bilan birga ishlatiladi:

example.go
if _, err := os.Stat("mavjud_emas.txt"); os.IsNotExist(err) {
    fmt.Println("Bunday fayl mavjud emas")
}

5. Fayl va papkalarni o'chirish, yaratish: Remove(), Mkdir()

example.go
package main

import (
    "fmt"
    "os"
)

func main() {
    // faylni o'chiramiz
    os.Remove("salom.txt")

    // yangi papka yaratamiz (0755 — papka ruxsatlari)
    err := os.Mkdir("yangi-papka", 0755)

    fmt.Println(err)
}

Natija (agar papka avvaldan mavjud bo'lmasa):

kod
<nil>

[!NOTE] Agar bir nechta ichma-ich papka yaratish kerak bo'lsa (masalan, a/b/c), os.Mkdir() faqat oxirgi darajani yaratadi va oraliq papkalar mavjud bo'lmasa xatolik beradi. Bunday holda os.MkdirAll() ishlatiladi — u yo'q bo'lgan barcha oraliq papkalarni ham avtomatik yaratadi.


6. Standart kirish/chiqish oqimlari: Stdin, Stdout, Stderr

fmt.Println() aslida "orqa fonda" os.Stdoutga yozadi. Ba'zan xatoliklarni oddiy natijadan ajratib, alohida os.Stderr ga yozish yaxshi amaliyot hisoblanadi:

example.go
package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Fprintln(os.Stdout, "Bu oddiy natija")
    fmt.Fprintln(os.Stderr, "Bu xatolik xabari")
}

Natija (ikkalasi ham konsolda ko'rinadi, lekin dastur chaqirilganda ular alohida-alohida "yo'naltirilishi" mumkin):

kod
Bu oddiy natija
Bu xatolik xabari

7. Dasturni majburan to'xtatish: os.Exit()

example.go
package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println("Ishga tushdi")

    if true { // masalan, jiddiy xatolik yuz bergan holat
        fmt.Println("Jiddiy xatolik! Dastur to'xtatilmoqda.")
        os.Exit(1) // 0 dan boshqa qiymat — xatolik bilan tugaganini bildiradi
    }

    fmt.Println("Bu qator hech qachon bajarilmaydi")
}

Natija:

kod
Ishga tushdi
Jiddiy xatolik! Dastur to'xtatilmoqda.

[!WARNING] os.Exit() dasturni darhol to'xtatadi — hatto defer orqali rejalashtirilgan tozalash amallari (fayl yopish, ulanishni uzish) ham ishlamay qoladi! Shuning uchun uni faqat main() funksiyasining eng oxirida yoki barcha tozalash ishlari tugagandan keyin ishlatish tavsiya etiladi.


Xulosa: qachon qaysi funksiya kerak?

VazifaFunksiya
Buyruq qatori argumentlarini olishos.Args
Muhit o'zgaruvchisini o'qishos.Getenv() / os.LookupEnv()
Faylga yozish / undan o'qish (kichik fayllar)os.WriteFile() / os.ReadFile()
Fayl haqida ma'lumot (hajmi, mavjudligi)os.Stat()
Fayl/papka o'chirish, papka yaratishos.Remove(), os.Mkdir(), os.MkdirAll()
Xatolik xabarini alohida oqimga yozishos.Stderr
Dasturni to'xtatishos.Exit(kod)