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.
import "os"
os.ArgsDastur terminal orqali qanday argumentlar bilan ishga tushirilganini bilish uchun os.Args ishlatiladi:
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:
[/tmp/.../main ali 25]
os.Args[1] — "ali", os.Args[2] — "25" bo'ladi.
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):
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:
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 ravishdaboolqiymat (ok) ham qaytaradi.
WriteFile() va ReadFile()Kichik fayllar bilan ishlashning eng qisqa yo'li — butun faylni bir yo'la yozish yoki o'qish:
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:
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 ishlaydiganos.Open()/os.Create()+bufiopaketidan foydalanish tavsiya etiladi — bu haqda keyingi darsda gaplashamiz.
os.Stat()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:
Nomi: salom.txt
Hajmi (bayt): 12
Fayl mavjud yoki yo'qligini tekshirish uchun ko'pincha shu funksiya os.IsNotExist() bilan birga ishlatiladi:
if _, err := os.Stat("mavjud_emas.txt"); os.IsNotExist(err) {
fmt.Println("Bunday fayl mavjud emas")
}
Remove(), Mkdir()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):
<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 holdaos.MkdirAll()ishlatiladi — u yo'q bo'lgan barcha oraliq papkalarni ham avtomatik yaratadi.
Stdin, Stdout, Stderrfmt.Println() aslida "orqa fonda" os.Stdoutga yozadi. Ba'zan xatoliklarni oddiy natijadan ajratib, alohida os.Stderr ga yozish yaxshi amaliyot hisoblanadi:
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):
Bu oddiy natija
Bu xatolik xabari
os.Exit()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:
Ishga tushdi
Jiddiy xatolik! Dastur to'xtatilmoqda.
[!WARNING]
os.Exit()dasturni darhol to'xtatadi — hattodeferorqali rejalashtirilgan tozalash amallari (fayl yopish, ulanishni uzish) ham ishlamay qoladi! Shuning uchun uni faqatmain()funksiyasining eng oxirida yoki barcha tozalash ishlari tugagandan keyin ishlatish tavsiya etiladi.
| Vazifa | Funksiya |
|---|---|
| Buyruq qatori argumentlarini olish | os.Args |
| Muhit o'zgaruvchisini o'qish | os.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 yaratish | os.Remove(), os.Mkdir(), os.MkdirAll() |
| Xatolik xabarini alohida oqimga yozish | os.Stderr |
| Dasturni to'xtatish | os.Exit(kod) |