Pelajaran modul (1/5)
`fmt` tingkat lanjut
Paket fmt adalah pintu gerbang ke semua I/O tekstual di Go. Mengetahuinya dengan baik berarti menulis log yang dapat dibaca, kesalahan informatif, dan memformat nilai secara idiomatis tanpa menggunakan perpustakaan eksternal.
Keempat keluarga
fmt memaparkan fungsi dalam empat kelompok, dibedakan berdasarkan awalan:
Print*→ menulis keos.Stdout(Print,Println,Printf).Fprint*→ menulis keio.Writermana saja (Fprintln(os.Stderr, ...),Fprintf(file, ...)).Sprint*→ mengembalikan string tanpa dicetak (Sprintf,Sprintln).Errorf→ membuaterroryang diformat.
fmt.Println("hello") // stdout
fmt.Fprintln(os.Stderr, "boom") // stderr
s := fmt.Sprintf("[%d]", 42) // "[42]"
err := fmt.Errorf("parse %q: %w", in, base) // wrapped errorPerbedaan antara Print dan Println hanyalah spasi antara argumen dan baris baru di belakangnya: Println selalu menambahkan \n, Print tidak, Printf mengikuti formatnya.
Kata kerja utama
| kata kerja | Apa fungsinya |
|---|---|
%v | Nilai default (panggil String() jika diterapkan). |
%+v | Struktur dengan nama kolom. |
%#v | Sintaks Go (berguna untuk debugging dan snapshot). |
%T | Jenis nilai yang dinamis. |
%d | Bilangan bulat dalam basis 10. |
%b %o %x %X | Biner, oktal, heksadesimal (huruf kecil/besar). |
%f %e %g | Titik mengambang: tetap, eksponensial, kompak. |
%s | Tali (atau error/Stringer). |
%q | String quoted gaya Go (termasuk escape). |
%c | Karakter unicode (rune). |
%p | Penunjuk dalam heksadesimal. |
%w | Pembungkusan kesalahan (hanya di dalam Errorf). |
type Point struct{ X, Y int }
p := Point{1, 2}
fmt.Printf("%v\n", p) // {1 2}
fmt.Printf("%+v\n", p) // {X:1 Y:2}
fmt.Printf("%#v\n", p) // main.Point{X:1, Y:2}
fmt.Printf("%T\n", p) // main.PointLebar, presisi, bendera
Kata kerja numerik dan string menerima lebar dan presisi:
%6d→ lebar minimum 6, bantalan kiri dengan spasi.%-6d→ lebar 6, padding kanan (bendera-).%06d→ lebar 6, diisi dengan0(bendera0).%.2f→ presisi 2 angka desimal.%8.2f→ lebar 8, presisi 2.
fmt.Printf("|%6d|\n", 42) // | 42|
fmt.Printf("|%-6d|\n", 42) // |42 |
fmt.Printf("|%06d|\n", 42) // |000042|
fmt.Printf("|%8.2f|\n", 3.14)// | 3.14|Untuk tabel rata, lebar tetap + %-...s untuk kolom teks adalah pola paling sederhana sebelum berpindah ke text/tabwriter.
%w dan kesalahan pembungkusan
%w istimewa: ia berfungsi hanya di dalam fmt.Errorf dan mempertahankan kesalahan asli dalam rantai, sehingga errors.Is dan errors.As dapat menjalankannya.
if _, err := os.Open(path); err != nil {
return fmt.Errorf("read config %q: %w", path, err)
}Menggunakan %v alih-alih %w mencetak pesan kesalahan tetapi memutus rantai: tidak perlu dibuka, tidak ada errors.Is. Aturan: jika Anda ingin penelepon dapat membedakan jenis atau identitas kesalahan, gunakan %w (hanya satu per Errorf).
Latihan
Gunakan fmt.Sprintf untuk memformat string '[42]' dari bilangan bulat 42, lalu cetak.
Solusi tersedia setelah 3 upaya
Cetak struct p dengan kata kerja %+v (harus menyertakan nama field).
Solusi tersedia setelah 3 upaya
Kata kerja manakah yang digunakan di fmt.Errorf yang mempertahankan rantai kesalahan untuk error.Is/As?
err := fmt.Errorf("read %q: ???", path, base)