Pendahuluan

Gofmt adalah sebuah perkakas yang secara otomatis memformat sumber kode Go.

Kode yang menggunakan gofmt:

  • mudah untuk ditulis: tidak perlu khawatir tentang masalah format saat menulis kode

  • mudah untuk dibaca: saat semua kode tampak sama, kita tidak perlu terlalu berpikir mengonversi gaya format orang lain ke bentuk yang kita pahami.

  • mudah di rawat: perubahan mekanis terhadap kode tidak menyebabkan perubahan lain yang tidak berkaitan dengan format isi berkas; perkakas diff (yang membantu melihat perubahan sebelum dan sesudah) memperlihatkan hanya yang berubah.

  • tidak kontroversial: tidak perlu debat tentang spasi atau posisi kurung buka lagi!

Memformat kode Anda

Kita baru-baru ini melakukan survei terhadap paket-paket Go di luar sana dan menemukan bahwa 70% telah di-format menurut aturan-aturan gofmt. Hal ini lebih baik dari yang diduga — dan terima kasih kepada semua orang yang menggunakan gofmt — tapi akan lebih bagus bila sisanya juga demikian.

Untuk mem-format kode Go, Anda dapat menggunakan perkakas gofmt:

gofmt -w yourcode.go

atau menggunakan perintah go fmt:

go fmt path/to/your/package

Untuk menjaga kode Anda supaya tetap dengan gaya kanonis, repositori Go menyediakan pendukung untuk editor dan sistem kontrol versi yang mempermudah menjalankan gofmt pada kode Anda.

Bagi pengguna Vim, plugin Vim untuk Go memiliki perintah :Fmt yang menjalankan gofmt pada buffer yang sekarang.

Bagi pengguna emacs, go-mode.el menyediakan sebuah pembantu gofmt-before-save yang dapat dipasang dengan menambahkan baris berikut ke berkas .emacs:

(add-hook 'before-save-hook #'gofmt-before-save)

Bagi pengguna Eclipse atau Sublime Text, proyek GoClipse dan GoSublime menambah fasilitas gofmt ke penyunting tersebut.

Dan untuk pengguna Git, skrip misc/git/pre-commit adalah pembantu pra-commit yang menjaga supaya kode Go yang salah format tidak ter-commit. Jika Anda pengguna Mercurial, pembantu hgstyle menyediakan pembantu pra-commit untuk gofmt.

Mekanisme transformasi sumber

Salah satu keunggulan dari kode yang diformat-mesin yaitu ia dapat ditransformasi secara mekanis tanpa menyebabkan gangguan format yang tidak berkaitan pada saat diff. Transformasi mekanis sangat berguna saat bekerja dalam basis kode yang besar, karena ia lebih komprehensif dan jarang gagal daripada membuat perubahan secara manual. Tentu saja, saat bekerja pada skala yang besar (seperti yang kami lakukan di Google) sangatlah tidak praktis melakukan perubahan seperti itu secara manual.

Cara paling mudah mengubah kode Go yaitu dengan opsi -r pada perintah "gofmt". Opsi tersebut menentukan aturan penggantian dalam bentuk:

pola -> pengganti

yang mana "pola" dan "pengganti" adalah ekspresi Go yang valid. Pada "pola", huruf kecil tunggal berfungsi sebagai wildcard yang menerima sub-ekspresi apa pun, dan ekspresi tersebut akan diganti dengan pengidentifikasi yang sama pada bagian "pengganti".

Misalnya, perubahan terbaru pada sumber kode Go menulis ulang penggunaan bytes.Compare dengan menggunakan fungsi bytes.Equal yang lebih efisien. Kontributor membuat perubahan tersebut menggunakan pemanggilan gofmt dua kali:

gofmt -r 'bytes.Compare(a, b) == 0 -> bytes.Equal(a, b)'
gofmt -r 'bytes.Compare(a, b) != 0 -> !bytes.Equal(a, b)'

Gofmt juga mengaktifkan gofix, yang dapat membantu transformasi sumber kode yang kompleks. Gofix adalah perkakas yang sangat berguna selama masa-masa awal saat kami sering membuat perubahan yang besar terhadap bahasa dan pustaka. Misalnya, sebelum Go 1 interface error bawaan belum ada dan konvensinya adalah menggunakan tipe os.Error. Saat kami memperkenalkan error, kita menyediakan modul gofix yang menulis ulang semua penggunaan os.Error berikut dengan fungsi-fungsi pembantu lainnya supaya menggunakan error dan paket errors yang baru. Akan sangat lama dan sukar apabila hal ini dilakukan secara manual, namun dengan kode yang sudah di-format akibatnya perubahan yang hampir menyentuh semua kode Go tersebut mudah untuk disiapkan, dieksekusi, dan ditinjau.

Untuk informasi lebih lanjut tentang gofix, lihat artikel berikut.