Section 10

10-dars — Fayllar bilan ishlash

os.WriteFile, []byte, fmt.Sprint, os.ReadFile, string(), strconv.ParseFloat va _ (blank identifier)


Hozir bankni yopsak, balans yo'qoladi — chunki u faqat operativ xotirada (o'zgaruvchida). Endi balansni faylga saqlaymiz, dastur qayta ochilganda o'qib oladi — shunda u dastur ishga tushishlari orasida saqlanib qoladi.

1. Faylga yozish — os.WriteFile

Yangi paket kerak: os (operatsion tizim va fayl tizimi bilan ishlash).

import (
	"fmt"
	"os"
)
 
func writeBalanceToFile(balance float64) {
	balanceText := fmt.Sprint(balance)
	os.WriteFile("balance.txt", []byte(balanceText), 0644)
}

Qator-qator:

  • fmt.Sprint(balance) — sonni stringga aylantiradi (Sprint — ekranga emas, stringga). Fayllarga matn yoziladi.
  • os.WriteFile(...) — uchta narsa oladi:
    1. "balance.txt" — fayl nomi (agar yo'q bo'lsa, yaratadi)
    2. []byte(balanceText) — yoziladigan ma'lumot (baytlar ko'rinishida)
    3. 0644 — fayl ruxsatlari

[]byte nima?

Fayllar baytlardan iborat. []byte(balanceText) — stringni baytlar to'plamiga o'giradi ([]byte(...) — konvertatsiya funksiyasi). os.WriteFile aynan baytlarni talab qiladi.

0644 — fayl ruxsatlarini kodlash usuli (Linux/operatsion tizimlarda umumiy). Ma'nosi: egasi o'qiy va yoza oladi, boshqalar faqat o'qiy oladi. Hozircha shu raqamni shunchaki ishlatib turing. (Kvadrat qavslar []byte ham keyinroq — "slice" mavzusida — chuqurroq ochiladi.)

Endi pul qo'yish/yechishdan keyin shu funksiyani chaqiramiz:

accountBalance += depositAmount
fmt.Println("Balance updated! New amount:", accountBalance)
writeBalanceToFile(accountBalance)

2. Fayldan o'qish — os.ReadFile

Yangi paket: strconv (string conversion — string ↔ son).

import (
	"fmt"
	"os"
	"strconv"
)
 
const accountBalanceFile = "balance.txt"
 
func getBalanceFromFile() float64 {
	data, _ := os.ReadFile(accountBalanceFile)
	balanceText := string(data)
	balance, _ := strconv.ParseFloat(balanceText, 64)
	return balance
}

Qator-qator:

  • os.ReadFile(...) — fayldagi baytlarni o'qiydi (data).
  • string(data) — baytlarni qaytadan stringga o'giradi (float64 to'g'ridan-to'g'ri baytlar bilan ishlamaydi, string bilan ishlaydi).
  • strconv.ParseFloat(balanceText, 64) — stringni songa aylantiradi. 64float64 degani (32 desangiz — kamroq aniqlikdagi float32).

Fayl nomini global const qilish

balance.txt ni ikki funksiyada ishlatamiz. Takrorlamaslik uchun uni global const qildik (accountBalanceFile). Endi nomni o'zgartirish kerak bo'lsa, bitta joyda o'zgartiramiz.

_ (blank identifier) nima?

os.ReadFile va ParseFloat ikkita qiymat qaytaradi: natija va xato (error). Hozircha xatoni e'tiborsiz qoldiramiz — buning uchun _ yozamiz. _ degani: "bu qiymat menga kerak emas, tashlab yubor".

Agar qiymatni olib, ishlatmasangiz, Go xato beradi (ishlatilmagan o'zgaruvchi). _ bu xatodan qutqaradi. Lekin xatoni butunlay e'tiborsiz qoldirish xavfli — masalan fayl bo'lmasa, dastur noto'g'ri ishlaydi. Buni keyingi (11-)darsda to'g'rilaymiz.


3. Hammasini ulash

main boshida balansni o'zgaruvchi emas, fayldan olamiz:

func main() {
	var accountBalance = getBalanceFromFile()
 
	fmt.Println("Welcome to Go Bank!")
 
	for {
		// ... menyu, switch, har o'zgarishdan keyin writeBalanceToFile(accountBalance)
	}
}

Endi dasturni yoping va qayta oching — balans saqlanib qoladi. Bu — birinchi "haqiqiy" funksiya: ma'lumot fayl orqali yashaydi.


O'zingiz sinab ko'ring

  1. writeBalanceToFile ni yozing va deposit/withdraw'dan keyin chaqiring. Dasturni ishlatib, balance.txt paydo bo'lganini ko'ring.
  2. getBalanceFromFile ni yozib, main boshida ishlating.
  3. Dasturni yoping, qayta oching — balans saqlandimi?
  4. balance.txt ni qo'lda ochib, ichidagi sonni o'zgartiring, dasturni qayta ishga tushiring. Nima bo'ldi?
  5. balance.txt ni o'chirib dasturni ishga tushiring — balans nechchi chiqadi? (Keyingi darsda buni to'g'rilaymiz.)

9-dars · → 11-dars — Xatolarni boshqarish