Lompati ke konten utama
Modul 8 · Pelajaran 1 dari 536/50 dalam kursus~10 min
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 ke os.Stdout (Print, Println, Printf).
  • Fprint* → menulis ke io.Writer mana saja (Fprintln(os.Stderr, ...), Fprintf(file, ...)).
  • Sprint* → mengembalikan string tanpa dicetak (Sprintf, Sprintln).
  • Errorf → membuat error yang diformat.
Go
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 error

Perbedaan 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 kerjaApa fungsinya
%vNilai default (panggil String() jika diterapkan).
%+vStruktur dengan nama kolom.
%#vSintaks Go (berguna untuk debugging dan snapshot).
%TJenis nilai yang dinamis.
%dBilangan bulat dalam basis 10.
%b %o %x %XBiner, oktal, heksadesimal (huruf kecil/besar).
%f %e %gTitik mengambang: tetap, eksponensial, kompak.
%sTali (atau error/Stringer).
%qString quoted gaya Go (termasuk escape).
%cKarakter unicode (rune).
%pPenunjuk dalam heksadesimal.
%wPembungkusan kesalahan (hanya di dalam Errorf).
Go
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.Point

Lebar, 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 dengan 0 (bendera 0).
  • %.2f → presisi 2 angka desimal.
  • %8.2f → lebar 8, presisi 2.
Go
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.

Go
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

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

Gunakan fmt.Sprintf untuk memformat string '[42]' dari bilangan bulat 42, lalu cetak.

Memuat editor…

Solusi tersedia setelah 3 upaya

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

Cetak struct p dengan kata kerja %+v (harus menyertakan nama field).

Memuat editor…

Solusi tersedia setelah 3 upaya

Quiz#go.m8.l1.e3
Siap

Kata kerja manakah yang digunakan di fmt.Errorf yang mempertahankan rantai kesalahan untuk error.Is/As?

Go
err := fmt.Errorf("read %q: ???", path, base)
Pilihan jawaban