Kecepatan go run memang pas untuk sesi belajar dan pengembangan, tetapi pengguna akhir program kita tidak selalu memiliki Go di komputernya. Untuk kebutuhan itu Go menyediakan go build: perintah yang mengompilasi program menjadi satu file binary yang berdiri sendiri. Binary hasil build dapat dikirim ke server, disematkan pada container, atau dibagikan ke rekan kerja tanpa membawa kode sumber maupun toolchain. Pada chapter ini kita bangun binary dari halo.go, jalankan hasilnya, lalu lihat sekilas kemampuan cross-compile.

Membangun Binary Pertama #

Berkas halo.go pada folder chapter ini berisi program sapaan yang siap dikompilasi:

go
package main

import "fmt"

func main() {
	fmt.Println("Halo dari program yang dikompilasi!")
}

Bangun binary dengan opsi -o yang menentukan nama file hasil kompilasi, lalu periksa hasilnya:

bash
go build -o halo halo.go
ls -lh halo

Output yang Dihasilkan:

text
-rwxrwxr-x 1 z z 2.3M Oct 13 07:28 halo

Mari kita telaah baris demi baris program halo.go di atas:

  1. Baris 1 (package main): menandai berkas sebagai program yang dapat dieksekusi, syarat yang dicari go build.
  2. Baris 3 (import "fmt"): memuat package fmt untuk fungsi pencetakan.
  3. Baris 5 (func main() {): titik masuk program yang menjadi awal eksekusi binary.
  4. Baris 6 (fmt.Println(...)): statement yang mencetak sapaan saat binary dijalankan.

Opsi -o halo memberi nama file hasil kompilasi sesuai keinginan kita. Tanpa opsi tersebut, go build memakai nama lain yang akan kita lihat sebentar lagi. Ukuran file sekitar 2-3 MB untuk program sekecil ini memang terasa besar, tetapi wajar: binary Go secara default menyertakan runtime beserta seluruh kode standard library yang dipakai, sehingga binary tidak bergantung pada library terpisah di sistem pengguna.

Menjalankan Binary #

Binary hasil kompilasi adalah file executable biasa. Kita menjalankannya langsung dengan awalan ./ karena file tersebut berada di direktori aktif:

bash
./halo

Output yang Dihasilkan:

text
Halo dari program yang dikompilasi!

Output yang sama dengan go run halo.go kini dihasilkan tanpa melibatkan perintah go sama sekali. Tidak ada kompilasi yang terjadi saat binary dijalankan; seluruh pekerjaan build sudah selesai pada saat go build tadi. Bedanya dengan go run, eksekusi ./halo melompati pemeriksaan cache dan seluruh tahapan toolchain, sehingga waktu yang terpakai murni waktu eksekusi program. File halo inilah yang kita salin ke server atau kirim ke pengguna bila ingin mendistribusikan program.

go build Tanpa Opsi -o #

go build tanpa opsi -o dan tanpa nama berkas akan mengompilasi package di direktori aktif dan menamai binary mengikuti nama foldernya:

bash
go build
ls -lh

Output yang Dihasilkan:

text
total 4.5M
-rwxrwxr-x 1 z z 2.3M Oct 13 07:28 halo
-rw-rw-r-- 1 z z   96 Oct 13 07:15 halo.go
-rw-rw-r-- 1 z z 5.3K Oct 13 07:27 index.md
-rwxrwxr-x 1 z z 2.3M Oct 13 07:28 kompilasi-program

Sistem operasi juga memengaruhi penamaan: di Windows, binary otomatis diberi akhiran .exe seperti halo.exe walaupun kita tidak menuliskannya. Perintah di atas memakai package di direktori aktif, sehingga berlaku catatan module yang sama dengan go run .: folder tanpa go.mod akan ditolak dengan pesan go.mod file not found.

Cross-Compile Secara Kilas #

Kompiler Go dapat membangun binary untuk sistem operasi dan arsitektur lain dari komputer yang sama. Cukup atur variabel lingkungan GOOS dan GOARCH saat memanggil go build:

bash
GOOS=windows GOARCH=amd64 go build -o halo.exe halo.go
ls -lh halo.exe

Output yang Dihasilkan:

text
-rwxrwxr-x 1 z z 2.4M Oct 13 07:28 halo.exe

File halo.exe di atas dibangun untuk Windows 64-bit sehingga tidak dapat dijalankan di Linux; formatnya PE executable, bukan ELF seperti binary Linux. Kombinasi GOOS dan GOARCH yang umum antara lain linux/amd64, darwin/arm64 untuk Mac modern, dan windows/amd64. Daftar lengkap serta praktik distribusinya dibahas di chapter Cross Compilation .

Dari go run yang cepat hingga go build yang menghasilkan binary siap distribusi, perjalanan kita kini lengkap. Namun dunia nyata tidak selalu berjalan mulus: compiler kerap menolak kode kita dengan pesan yang belum tentu langsung terbaca. Keterampilan terakhir section ini adalah membedah pesan error compiler, dan itulah fokus chapter penutup kita.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

halo.go

Unduh berkas
go
package main

import "fmt"

func main() {
	fmt.Println("Halo dari program yang dikompilasi!")
}