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:"balance.txt"— fayl nomi (agar yo'q bo'lsa, yaratadi)[]byte(balanceText)— yoziladigan ma'lumot (baytlar ko'rinishida)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[]byteham 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 (float64to'g'ridan-to'g'ri baytlar bilan ishlamaydi, string bilan ishlaydi).strconv.ParseFloat(balanceText, 64)— stringni songa aylantiradi.64—float64degani (32desangiz — kamroq aniqlikdagifloat32).
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
writeBalanceToFileni yozing va deposit/withdraw'dan keyin chaqiring. Dasturni ishlatib,balance.txtpaydo bo'lganini ko'ring.getBalanceFromFileni yozib,mainboshida ishlating.- Dasturni yoping, qayta oching — balans saqlandimi?
balance.txtni qo'lda ochib, ichidagi sonni o'zgartiring, dasturni qayta ishga tushiring. Nima bo'ldi?balance.txtni o'chirib dasturni ishga tushiring — balans nechchi chiqadi? (Keyingi darsda buni to'g'rilaymiz.)