← Danh sách bài học Bài 15/20

📄 Bài 15: Đọc Ghi File

⏱️ 20 phút | 📚 Trung bình

🎯 Mục tiêu:

1. Đọc Toàn Bộ File

package main

import (
    "fmt"
    "os"
)

func main() {
    // Đọc toàn bộ file vào []byte
    data, err := os.ReadFile("hello.txt")
    if err != nil {
        fmt.Println("Lỗi:", err)
        return
    }
    
    // Convert []byte → string
    fmt.Println(string(data))
}

2. Ghi File

package main

import (
    "fmt"
    "os"
)

func main() {
    content := "Xin chào Go!\nĐây là file test."
    
    // Ghi file (tạo mới hoặc ghi đè)
    // 0644 = quyền đọc/ghi
    err := os.WriteFile("output.txt", []byte(content), 0644)
    if err != nil {
        fmt.Println("Lỗi:", err)
        return
    }
    
    fmt.Println("Ghi file thành công!")
}

3. Mở File Với os.Open

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("data.txt")
    if err != nil {
        fmt.Println("Lỗi:", err)
        return
    }
    defer file.Close()  // Đảm bảo đóng file
    
    // Đọc từng dòng
    scanner := bufio.NewScanner(file)
    lineNum := 1
    for scanner.Scan() {
        fmt.Printf("%d: %s\n", lineNum, scanner.Text())
        lineNum++
    }
}
💡 defer: Đảm bảo file.Close() được gọi khi hàm kết thúc, dù có lỗi hay không.

4. Ghi File Với os.Create

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    file, err := os.Create("log.txt")
    if err != nil {
        fmt.Println("Lỗi:", err)
        return
    }
    defer file.Close()
    
    writer := bufio.NewWriter(file)
    writer.WriteString("Log line 1\n")
    writer.WriteString("Log line 2\n")
    writer.Flush()  // Đẩy buffer vào file
    
    fmt.Println("Ghi log thành công!")
}

5. Append Vào File

// O_APPEND - thêm vào cuối
// O_CREATE - tạo nếu chưa có
// O_WRONLY - chỉ ghi
file, err := os.OpenFile("log.txt", 
    os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
    return
}
defer file.Close()

file.WriteString("New log entry\n")

📝 Tóm Tắt