← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 45

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`.