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:
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:
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
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.
// 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:
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.
fmt.Fprintln(os.Stderr, "log diagnostico")
io.Copy(os.Stdout, os.Stdin) // echoLatihan
Cetak argumen baris perintah pertama (os.Args[1]). Jika tidak ada, cetak 'manca argomento' dan kembalikan.
Solusi tersedia setelah 3 upaya
Tulis string 'ciao' ke file 'out.txt' dengan os.WriteFile (izin 0644). Tangani kesalahannya.
Solusi tersedia setelah 3 upaya
Apa indeks NAMA PROGRAM di os.Args?
fmt.Println(os.Args[???])