File
Baca, tulis, dan susuri isi berkas.
Pahami konsepnya
Cara termudah membaca berkas kecil: os.ReadFile(nama) mengembalikan seluruh isi sebagai []byte; pasangannya os.WriteFile(nama, data, 0644) menimpa atau membuat berkas dengan izin Unix. Keduanya menutup berkas otomatis — tidak ada yang di-defer.
Untuk berkas besar atau berbaris, buka dengan os.Open lalu susuri dengan bufio.Scanner: Scan() maju satu baris, Text() menyerahkan isinya. Pola baku: f, err := os.Open(...); defer f.Close(); scanner := bufio.NewScanner(f); for scanner.Scan(). Menulis bertahap: os.Create + WriteString + defer Close.
Direktori juga beroperasi lewat paket os: MkdirAll membuat folder bertingkat, RemoveAll menghapus, dan os.ReadDir mendaftar isi folder sebagai entri ber-name dan IsDir. Untuk berjalan menyeluruh pohon folder besar, filepath.WalkDir mengunjungi tiap berkas dengan callback.
Coba contoh kode
package main
import (
"fmt"
"os"
)
func main() {
if err := os.WriteFile("catatan.txt", []byte("baris pertama\nbaris kedua"), 0644); err != nil {
fmt.Println("gagal menulis:", err)
return
}
isi, err := os.ReadFile("catatan.txt")
if err != nil {
fmt.Println("gagal membaca:", err)
return
}
fmt.Print(string(isi))
}WriteFile membuat atau menimpa catatan.txt dengan izin 0644 (pemilik baca-tulis, lainnya baca), lalu ReadFile menyerahkan seluruh isinya dalam satu panggilan. Keduanya menutup berkas otomatis — untuk berkas kecil, tidak ada langkah lain yang diperlukan.
Membaca per baris
func main() {
f, err := os.Open("catatan.txt")
if err != nil {
return
}
defer f.Close()
scanner := bufio.NewScanner(f)
nomor := 1
for scanner.Scan() {
fmt.Printf("%d: %s\n", nomor, scanner.Text())
nomor++
}
}Scanner membaca hemat memori: satu baris dipegang pada satu waktu, sehingga berkas berukuran gigabyte pun aman disusuri. Pola Open + defer Close + Scan ini adalah bentuk paling sering kamu tulis saat mengolah log atau CSV.
Membuat folder bertingkat
func main() {
err := os.MkdirAll("data/2026/oktober", 0755)
if err != nil {
fmt.Println(err)
return
}
entri, _ := os.ReadDir("data")
for _, e := range entri {
fmt.Println(e.Name(), e.IsDir())
}
}MkdirAll membuat seluruh jalur sekaligus — folder induk yang belum ada ikut dibuat tanpa error. ReadDir mendaftar isi folder: tiap entri punya Name dan IsDir untuk memilah berkas dari subfolder.
Latihan singkat
Uji: tulis dua baris ke catatan.txt, baca ulang, cetak jumlah barisnya — program harus mencetak persis `2`.