Topik ini membedah anatomi program Go terkecil yang dapat dijalankan, yaitu struktur package main dengan fungsi main, lalu membandingkan dua cara kerja perintah go run dan go build. Keduanya mengubah berkas sumber menjadi program yang berjalan, tetapi hasil akhirnya berbeda. Setelah membaca topik ini, alur dari berkas sumber hingga keluaran program dapat dijelaskan langkah demi langkah, lengkap dengan alasan mengapa Go memilih model kompilasi seperti itu.
Struktur program Go terkecil#
Program Go tersusun dari berkas sumber berektensi .go yang selalu dimulai dengan satu klausa package, yaitu deklarasi kepemilikan berkas terhadap satu unit kompilasi. Program yang bisa dijalankan langsung wajib berada di package bernama main, dan di dalamnya wajib ada fungsi main tanpa parameter dan tanpa nilai kembalian. Fungsi inilah titik masuk (entry point), yaitu tempat eksekusi program dimulai. Berkas berikut adalah program utuh yang siap dijalankan:
package main
import "fmt"
func main() {
celsius := 25.0
fahrenheit := celsius*9.0/5.0 + 32.0
fmt.Println("Konverter suhu sederhana")
fmt.Println(celsius, "derajat Celsius sama dengan", fahrenheit, "derajat Fahrenheit")
}Konverter suhu sederhana
25 derajat Celsius sama dengan 77 derajat FahrenheitSetiap baris berkas main.go memiliki peran yang jelas. Baris package main menyatakan bahwa berkas ini bagian dari package main, syarat mutlak agar go run dan go build menghasilkan program yang dapat dieksekusi. Baris import "fmt" memuat package fmt dari pustaka standar (standard library), yaitu kumpulan package yang menyertai setiap instalasi Go, sehingga fungsi pencetaknya dapat dipanggil. Baris func main() { membuka badan fungsi yang dieksekusi pertama kali, dan kurung kurawal penutup mengakhirinya.
Dua hal lain patut diperhatikan pada berkas yang sama. Pemanggilan fmt.Println menyebut nama package-nya lebih dahulu, karena fungsi yang diekspor dari package lain selalu diakses melalui nama tersebut. Selain itu, tidak ada titik koma di ujung baris. Kompilator Go menyisipkan titik koma secara otomatis di belakang layar. Alat gofmt, yang dibahas pada topik tentang komentar dan gofmt, menganggap penulisan tanda itu sebagai gangguan.
Menjalankan program dengan go run#
Perintah go run mengompilasi berkas sumber, menjalankan hasilnya, lalu menghapus berkas biner sementara itu begitu program selesai. Perintah ini praktis untuk siklus singkat, yaitu menyunting kode, menjalankan, melihat keluaran, lalu menyunting lagi. Urutan berikut menyalin main.go dari folder topik ke folder latihan tetap, kemudian menjalankannya:
mkdir -p /tmp/goprogram-pertama
cp main.go /tmp/goprogram-pertama/main.go
cd /tmp/goprogram-pertama
go run main.goKonverter suhu sederhana
25 derajat Celsius sama dengan 77 derajat FahrenheitKeluarannya identik dengan blok keluaran sebelumnya karena keduanya menjalankan program yang sama. Di belakang layar, go run menautkan (link) biner ke direktori sementara sistem, menjalankannya, lalu membersihkannya sendiri. Karena itu, tidak ada berkas baru yang tertinggal di folder kerja setelah perintah selesai, dan eksekusi ulang berikutnya tetap bersih.
Saat program membesar, fungsi main tidak harus sendirian dalam satu berkas. Beberapa berkas yang masing-masing menyatakan package main dapat dijalankan bersama dengan menyebut semua berkasnya, misalnya go run main.go util.go. Titik masuknya tetap satu fungsi main. Fungsi lain di berkas mana pun boleh dipanggil dari main selama masih berada dalam package yang sama. Mekanisme inilah jembatan dari program satu berkas menuju program yang tersusun atas banyak berkas.
Menghasilkan biner dengan go build#
Perintah go build mengompilasi berkas sumber menjadi berkas biner yang tetap tersimpan, tanpa menjalankannya. Pada platform Linux 64-bit, hasilnya adalah program yang berdiri sendiri, yaitu berkas yang sudah memuat kode mesin beserta runtime Go di dalamnya sehingga dapat disalin dan dijalankan di mesin lain tanpa instalasi Go. Perhatikan pula bahwa go build tidak mencetak apa pun ketika berhasil, sebuah konvensi alat baris perintah Unix yang juga diikuti go run. Pada folder latihan yang sama dengan bagian sebelumnya, kompilasi biner lalu jalankan hasilnya:
go build -o konversi main.go
./konversiKonverter suhu sederhana
25 derajat Celsius sama dengan 77 derajat FahrenheitBendera -o konversi menamai biner hasil kompilasi, sedangkan tanpa bendera itu nama biner mengikuti nama package atau berkas sumbernya. Biner konversi dapat dijalankan berulang kali tanpa proses kompilasi ulang karena seluruh pemeriksaan tipe dan penautan sudah selesai. Inilah perbedaan mendasar dengan bahasa skrip yang menafsirkan kode pada setiap kali program dijalankan.
Memilih antara go run dan go build#
Kedua perintah memakai jalur kompilasi yang sama, sehingga pilihan di antara keduanya adalah persoalan kebutuhan, bukan kemampuan. Tabel berikut merangkum perbedaannya.
| Aspek | go run | go build |
|---|---|---|
| Hasil akhir | Program dijalankan sekali, biner sementara dibuang | Biner tetap tersimpan di folder kerja |
| Langkah sampai program berjalan | Satu perintah | Dua langkah, build lalu eksekusi biner |
| Jejak berkas di folder kerja | Tidak ada | Satu berkas biner |
| Pemakaian yang lazim | Bereksperimen dan menguji cepat | Distribusi program dan skrip penerapan |
Pola kerja yang lazim adalah go run saat kode masih sering berubah dan go build saat program siap dibagikan atau dijalankan berulang. Apabila sumber tidak dapat dikompilasi, kedua perintah menampilkan pesan error yang sama lengkap dengan nomor barisnya, sehingga langkah pemecahan masalahnya identik. Perbedaannya semata terletak pada nasib biner setelah kompilasi berhasil. Keduanya juga menerima satu berkas seperti pada contoh ini maupun seluruh package sekaligus, misalnya go build ./..., yang menjadi pola baku ketika program terdiri atas banyak berkas.
Ringkasan#
- Program yang dapat dieksekusi wajib berupa package
maindan memuat fungsimainsebagai titik masuk eksekusi. go runmengompilasi, menjalankan, lalu membuang biner sementara, sehingga praktis untuk siklus penyuntingan cepat.go buildmenyimpan biner statis yang berdiri sendiri dan tidak mencetak apa pun saat berhasil.- Biner hasil
go buildmemuat runtime Go, sehingga dapat dijalankan di mesin lain tanpa instalasi Go.
Referensi#
- A Tour of Go: Basics — Go Documentation
— Pengenalan struktur program, package, dan fungsi
maindalam bentuk latihan interaktif. - How to Write Go Code — Go Documentation — Alur resmi dari berkas sumber, package, sampai menjalankan dan membangun program.
- The Go Programming Language Specification — The Go Project
— Spesifikasi resmi klausa package dan titik masuk
main.