Файл уншиж бичих
Бодит програм ихэвчлэн файлтай ажилладаг — тохиргоо унших, лог бичих, өгөгдөл хадгалах гэх мэт. Go-ийн os болон bufio package нь файлтай ажиллах бүх хэрэгслийг өгдөг.
Файл бүхэлд нь унших
Жижиг файлыг нэг дор уншихад os.ReadFile хамгийн хялбар:
package main
import (
"fmt"
"os"
)
func main() {
// Файлыг бүхэлд нь унших
content, err := os.ReadFile("hello.txt")
if err != nil {
fmt.Println("Файл уншихад алдаа:", err)
return
}
fmt.Println("Файлын агуулга:")
fmt.Println(string(content)) // []byte → string хөрвүүлэлт
}
os.ReadFile нь файлыг нэг удаад санах ойд уншдаг. Том файлд тохиромжгүй — мөр мөрөөр унших нь илүү сайн.
Файлд бичих
os.WriteFile нь файл үүсгэж бичидэг:
package main
import (
"fmt"
"os"
)
func main() {
content := "Сайн уу, файл!\nЭнэ хоёр дахь мөр.\n"
// 0644 нь файлын зөвшөөрөл: эзэн унших/бичих, бусад унших
err := os.WriteFile("output.txt", []byte(content), 0644)
if err != nil {
fmt.Println("Файлд бичихэд алдаа:", err)
return
}
fmt.Println("Файл амжилттай бичигдлээ")
}
Мөр мөрөөр унших — bufio.Scanner
Том файл эсвэл мөр мөрөөр боловсруулах шаардлагатай үед bufio.Scanner хэрэглэнэ:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("data.txt")
if err != nil {
fmt.Println("Файл нээхэд алдаа:", err)
return
}
defer file.Close() // функц дуусахад файл хаагдана
scanner := bufio.NewScanner(file)
lineNum := 1
for scanner.Scan() {
fmt.Printf("%d: %s\n", lineNum, scanner.Text())
lineNum++
}
if err := scanner.Err(); err != nil {
fmt.Println("Унших явцад алдаа:", err)
}
}
defer file.Close() нь файлыг хаахад маш чухал — defer ашиглан мартахгүй байх нь зөв хэв маяг.
Файлд мөр нэмэх (append)
Одоо байгаа файлын төгсгөлд мөр нэмэхдээ os.OpenFile ашиглана:
package main
import (
"fmt"
"os"
"time"
)
func writeLog(message string) error {
file, err := os.OpenFile(
"app.log",
os.O_APPEND|os.O_CREATE|os.O_WRONLY, // нэмэх, үүсгэх, бичих
0644,
)
if err != nil {
return err
}
defer file.Close()
timestamp := time.Now().Format("2006-01-02 15:04:05")
_, err = fmt.Fprintf(file, "[%s] %s\n", timestamp, message)
return err
}
func main() {
writeLog("Програм эхэллээ")
writeLog("Хэрэглэгч нэвтэрлээ")
writeLog("Гүйлгээ амжилттай")
fmt.Println("Лог бичигдлээ")
}
os.O_APPEND — файлын төгсгөлд нэмнэ.
os.O_CREATE — файл байхгүй бол үүсгэнэ.
os.O_WRONLY — зөвхөн бичих горим.
Хавтас үүсгэх ба шалгах
package main
import (
"fmt"
"os"
)
func main() {
// Хавтас үүсгэх (дотоод хавтасуудыг ч үүсгэнэ)
err := os.MkdirAll("data/logs/2024", 0755)
if err != nil {
fmt.Println("Хавтас үүсгэхэд алдаа:", err)
return
}
// Файл/хавтас байгаа эсэх шалгах
_, err = os.Stat("data/logs/2024")
if os.IsNotExist(err) {
fmt.Println("Хавтас олдсонгүй")
} else {
fmt.Println("Хавтас байна")
}
}
Дараагийн хичээлд:
Go-д JSON өгөгдлийг encode (struct → JSON) болон decode (JSON → struct) хийх — вэб API-тай ажиллах хамгийн чухал ур чадваруудын нэгийг сурна.