← Danh sách bài học
Bài 15/20
📄 Bài 15: Đọc Ghi File
🎯 Mục tiêu:
- Đọc file text đơn giản
- Ghi file text
- Đọc file theo dòng
- Sử dụng defer để đóng file
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
os.ReadFile()- đọc toàn bộ fileos.WriteFile()- ghi file đơn giảnos.Open()- mở để đọcos.Create()- tạo/ghi đè filedefer file.Close()- luôn đóng filebufio.Scanner- đọc từng dòng