Paket fmt

Println, verb Printf, dan Sprintf untuk pemformatan teks.

Daftar isi

Topik ini membahas package fmt, yaitu package pustaka standar untuk pemformatan teks, yang mencakup Println untuk pencetakan apa adanya, Printf dengan verb pemformatan, dan Sprintf yang mengembalikan hasil format sebagai string. Ketiga fungsi ini adalah alat pencetakan yang paling sering dipakai pada contoh-contoh awal Go. Setelah membaca topik ini, pemilihan di antara ketiganya dapat dilakukan tepat, dan verb yang lazim dapat dipakai tanpa menebak-nebak keluarannya.

Println dan keluarga pencetaknya#

fmt.Println menerima operan sebanyak apa pun, menambahkan satu spasi di antara setiap pasang operan, lalu menambahkan baris baru di akhir. Saudaranya fmt.Print tidak menambahkan baris baru dan menyisipkan spasi hanya di antara dua operan yang keduanya bukan string, sedangkan fmt.Printf memformat operan menurut pola yang ditentukan. Ketiganya mengembalikan jumlah byte yang tertulis dan error penulisan, yang pada pencetakan ke terminal hampir selalu diabaikan.

Perilaku spasi otomatis Println perlu diingat karena spasi itu menempel di antara operan, bukan mengelilinginya. Pemanggilan fmt.Println("total:", 77) menghasilkan total: 77, tetapi pemanggilan fmt.Println("total:", 77, "kWh") menghasilkan spasi sebelum satuan juga, yaitu total: 77 kWh. Bila posisi spasi harus diatur presisi, itu tugas Printf, bukan Println.

Operan yang bukan string diformat dengan aturan bawaan yang sama dengan %v, sehingga bilangan dan nilai logika dicetak dalam bentuk yang wajar tanpa persiapan apa pun. Pemanggilan fmt.Println(77, 3.2, true) menghasilkan 77 3.2 true, dan pola inilah yang menjadikan fungsi ini alat intip yang praktis saat menyelidiki isi variabel. Untuk keluaran yang akan dibaca pengguna, kontrol yang lebih rinci biasanya masih diperlukan, dan di sinilah Printf mengambil alih.

Printf dan verb pemformatan#

fmt.Printf menerima string format yang memuat verb, yaitu penanda berawalan % yang digantikan nilai operan sesuai aturan masing-masing. Program berikut memakai beberapa verb yang paling sering diperlukan:

go format-verb.go
package main

import "fmt"

func main() {
	nama := "Budi"
	umur := 25
	tinggi := 1.74
	ukuran := 1024

	fmt.Println("Nama  :", nama)
	fmt.Println("Umur  :", umur)
	fmt.Printf("%s berumur %d tahun\n", nama, umur)
	fmt.Printf("Tinggi %.2f meter\n", tinggi)
	fmt.Printf("Ukuran berkas %d byte sama dengan %x dalam heksadesimal\n", ukuran, ukuran)
	fmt.Printf("Nilai boolean: %t\n", true)
	fmt.Printf("Seratus persen ditulis 100%%\n")
}
text Keluaran
Nama  : Budi
Umur  : 25
Budi berumur 25 tahun
Tinggi 1.74 meter
Ukuran berkas 1024 byte sama dengan 400 dalam heksadesimal
Nilai boolean: true
Seratus persen ditulis 100%

Perhatikan bahwa baris baru \n pada akhir pola wajib ditulis sendiri, karena Printf tidak menambahkan baris baru secara otomatis. Tabel berikut merangkum verb yang paling sering dipakai sehari-hari.

VerbMenerimaHasil
%vNilai apa punFormat bawaan yang masuk akal untuk nilai itu
%dBilangan bulatDesimal
%sStringTeks apa adanya
%qString atau runeTeks dengan tanda kutip
%f, %.2fBilangan pecahanTitik apung, dengan 2 angka di belakang titik
%tbooltrue atau false
%xBilanganHeksadesimal huruf kecil
%TNilai apa punNama tipe nilainya
%%Tanpa operanSatu tanda persen

Verb %v layak menjadi pilihan cadangan, yaitu mencetak apa pun secara wajar, sehingga praktis untuk mengintip nilai yang tipenya belum diketahui. Presisi seperti %.2f ditulis di antara tanda % dan huruf verb, dan angkanya dapat diganti sesuai kebutuhan.

Sprintf untuk membangun string#

fmt.Sprintf bekerja persis seperti Printf dengan satu perbedaan, yaitu hasil format tidak dicetak, melainkan dikembalikan sebagai string. Fungsi ini adalah cara baku menyusun teks dari nilai-nilai terpisah, misalnya untuk pesan log atau kunci identitas. Program berikut menyusun ringkasan konversi suhu, kemudian mencetaknya:

go sprintf.go
package main

import "fmt"

func main() {
	celsius := 25.0
	fahrenheit := celsius*9.0/5.0 + 32.0

	ringkasan := fmt.Sprintf("%.1f derajat Celsius sama dengan %.1f derajat Fahrenheit", celsius, fahrenheit)

	fmt.Println(ringkasan)
	fmt.Println("Panjang teks ringkasan:", len(ringkasan), "byte")
}
text Keluaran
25.0 derajat Celsius sama dengan 77.0 derajat Fahrenheit
Panjang teks ringkasan: 56 byte

Pola Sprintf menghindari penyambungan teks dengan + yang rawan lupa menyisipkan spasi. Satu pola format membaca seperti kalimat utuh, sehingga niatnya langsung terlihat. Apabila hasilnya memang akan dicetak segera, panggil Printf langsung dan hindari satu langkah perantara yang tidak perlu.

Kebutuhan khas Sprintf muncul ketika teks yang tersusun belum tentu dicetak, misalnya pesan yang disimpan ke berkas log, kunci identitas yang memuat angka, atau nilai kembalian sebuah fungsi. Pemanggilan Printf langsung menulis ke aliran keluaran standar, sedangkan Sprintf menyerahkan hasilnya kepada pemanggil untuk menentukan nasibnya. Karena keduanya memakai mesin format yang sama, verb pada tabel di atas berlaku identik di keduanya.

go doc sebagai rujukan cepat#

Dokumentasi lengkap fmt tersedia daring di pkg.go.dev, tetapi rincian satu fungsi dapat ditanyakan langsung dari terminal dengan go doc. Perintah berikut menampilkan tanda tangan (signature) dan deskripsi resmi fmt.Sprintf:

bash
go doc fmt.Sprintf
text Keluaran
package fmt // import "fmt"

func Sprintf(format string, a ...any) string
    Sprintf formats according to a format specifier and returns the resulting
    string.

Keluaran ini bersumber dari komentar dokumentasi yang menyertai kode sumber fmt itu sendiri, sehingga selalu cocok dengan versi Go yang terpasang. Kebiasaan menanyakan go doc sebelum menebak perilaku verb akan menghemat banyak uji coba, karena halaman dokumentasi fmt memuat aturan lengkap presisi, lebar, dan bendera (flag) pemformatan.

Kesalahan umum#

Kesalahan pertama adalah jumlah operan yang tidak cocok dengan jumlah verb. Operan yang kurang meninggalkan penanda %!d(MISSING) pada posisi verb yang bermasalah, sedangkan operan yang berlebih dicetak sebagai penanda %!(EXTRA tipe=nilai) pada akhir keluaran. Gejala semacam ini hampir selalu muncul setelah pola format disunting tanpa menyesuaikan operannya, sehingga pencarian teks %! pada keluaran cukup untuk menemukan sebagian besar kesalahan format.

Kesalahan kedua adalah memilih verb yang tidak cocok dengan tipe operannya. Verb %d yang diberi string mencetak %!d(string=x), yaitu penanda yang memuat verb, tipe, dan nilainya sekaligus. Keluaran semacam ini tidak menghentikan program, sehingga mudah lolos pada pembacaan sekilas, tetapi keseluruhannya bermula dengan %! dan dapat dibedakan dari teks yang dimaksudkan.

Kesalahan ketiga adalah lupa menulis %% untuk satu tanda persen pada pola format. Tanda persen yang diikuti huruf apa pun dibaca sebagai awal verb, sehingga pola memaksakan format yang tidak dimaksudkan. Aturan ringkasnya, tanda persen pada pola Printf dan Sprintf selalu dibaca sebagai bagian verb, dan %v adalah pilihan aman ketika bentuk bawaan memang cukup.

Ringkasan#

  • Println menambahkan spasi antar operan dan baris baru di akhir, sedangkan Printf mengikuti pola format secara presisi tanpa baris baru otomatis.
  • Verb seperti %v, %d, %s, %.2f, %t, %T, dan %% menentukan bentuk tiap operan pada Printf dan Sprintf.
  • Sprintf mengembalikan hasil format sebagai string, sehingga menjadi cara baku menyusun teks dari nilai terpisah.
  • go doc fmt.Sprintf menampilkan dokumentasi resmi langsung dari terminal, selalu cocok dengan versi Go terpasang.

Referensi#