Lompati ke konten utama
Modul 8 · Pelajaran 3 dari 538/50 dalam kursus~14 min
Pelajaran modul (3/5)

`io` dan `os`: file dan aliran

Membaca dan menulis file dan stream di Go berkisar pada dua paket yang saling melengkapi: os (pembukaan, pembuatan, metadata, proses) dan io (antarmuka Reader/Writer yang mengabstraksi sumber byte apa pun).

Membaca dan menulis file: pintasan

Untuk file kecil atau konfigurasi, satu panggilan saja sudah cukup:

Go
data, err := os.ReadFile("input.txt")        // returns []byte
if err != nil {
    return err
}
fmt.Println(string(data))

err = os.WriteFile("out.txt", []byte("ciao"), 0644)

os.ReadFile terbuka, membaca semuanya ke dalam memori dan menutup. Sempurna hingga beberapa MB; lebih dari itu, streaming lebih baik.

Membuka file untuk streaming

Untuk file besar atau akses tambahan, buka file dan tutup dengan defer:

Go
f, err := os.Open("big.txt")        // read-only
if err != nil {
    return err
}
defer f.Close()

buf := make([]byte, 4096)
for {
    n, err := f.Read(buf)
    if n > 0 {
        process(buf[:n])
    }
    if err == io.EOF {
        break
    }
    if err != nil {
        return err
    }
}

os.Open terbuka dalam mode baca-saja. Untuk menulis gunakan os.Create (dipotong jika ada) atau os.OpenFile(path, flag, perm) dengan flag seperti os.O_APPEND | os.O_CREATE | os.O_WRONLY.

io.Reader dan io.Writer: antarmuka universal

Go
type Reader interface { Read(p []byte) (n int, err error) }
type Writer interface { Write(p []byte) (n int, err error) }

Di mana pun perpustakaan standar menerima io.Reader Anda dapat meneruskan file (*os.File), string (strings.NewReader), *bytes.Buffer, respons HTTP (resp.Body), dekompresor... Hal yang sama berlaku untuk io.Writer.

Go
// Copy from a Reader to a Writer (e.g. download → file).
n, err := io.Copy(dst, src)

io.Copy adalah pekerja keras untuk saluran pipa byte: ia menangani buffering dan EOF dengan benar. io.ReadAll(r) membaca semuanya hingga EOF menjadi []byte.

os.Args: argumen CLI

os.Args adalah potongan string: indeks 0 adalah nama program, dari 1 pada argumen sebenarnya:

Go
func main() {
    if len(os.Args) < 2 {
        fmt.Fprintln(os.Stderr, "uso: prog <nome>")
        os.Exit(1)
    }
    fmt.Println("ciao", os.Args[1])
}

Untuk penguraian yang lebih terstruktur (bendera, default, bantuan) gunakan paket flag dari stdlib atau perpustakaan eksternal seperti cobra.

os.Stdin, os.Stdout, os.Stderr

Ini adalah tiga *os.File global: di mana pun io.Reader atau io.Writer diterima, Anda dapat meneruskannya.

Go
fmt.Fprintln(os.Stderr, "log diagnostico")
io.Copy(os.Stdout, os.Stdin)  // echo

Latihan

Latihan#go.m8.l3.e1
Upaya: 0Memuat…

Cetak argumen baris perintah pertama (os.Args[1]). Jika tidak ada, cetak 'manca argomento' dan kembalikan.

Memuat editor…

Solusi tersedia setelah 3 upaya

Latihan#go.m8.l3.e2
Upaya: 0Memuat…

Tulis string 'ciao' ke file 'out.txt' dengan os.WriteFile (izin 0644). Tangani kesalahannya.

Memuat editor…

Solusi tersedia setelah 3 upaya

Quiz#go.m8.l3.e3
Siap

Apa indeks NAMA PROGRAM di os.Args?

Go
fmt.Println(os.Args[???])
Pilihan jawaban