Go / Файл уншиж бичих

Файл уншиж бичих

Бодит програм ихэвчлэн файлтай ажилладаг — тохиргоо унших, лог бичих, өгөгдөл хадгалах гэх мэт. Go-ийн os болон bufio package нь файлтай ажиллах бүх хэрэгслийг өгдөг.

Файл бүхэлд нь унших

Жижиг файлыг нэг дор уншихад os.ReadFile хамгийн хялбар:

go
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 нь файл үүсгэж бичидэг:

go
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 хэрэглэнэ:

go
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 ашиглана:

go
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 — зөвхөн бичих горим.

Хавтас үүсгэх ба шалгах

go
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-тай ажиллах хамгийн чухал ур чадваруудын нэгийг сурна.