Package adalah unit pengelompokan kode paling mendasar di Go: seluruh berkas .go di satu folder membentuk satu package. Dari sekian banyak package, Go memberi satu nama khusus, yaitu main, yang berfungsi sebagai penanda program yang dapat dieksekusi. Ketika kita menjalankan go run atau membangun binary dengan go build, toolchain mencari package bernama main sebagai targetnya. Pada chapter ini kita bedah perbedaan package main dengan package biasa, sekaligus melihat apa yang terjadi bila syaratnya tidak terpenuhi.

Package sebagai Unit Kode #

Semua berkas di dalam satu direktori harus menyatakan nama package yang sama, misalnya package kalkulator pada setiap berkas di folder kalkulator. Satu package berisi kumpulan fungsi, tipe, dan konstanta yang saling berbagi konteks: identifier yang dideklarasikan di satu berkas dapat langsung dipakai oleh berkas lain dalam package yang sama. Konsep ini membuat kode terorganisir tanpa memerlukan banyak aturan tambahan.

Satu package juga boleh terdiri dari banyak berkas sekaligus. Berkas input.go dan proses.go yang berada di folder sama dengan package clause identik tetap dianggap satu package oleh compiler, sehingga fungsi di satu berkas dapat memanggil fungsi di berkas lain tanpa perlu import. Inilah alasan package disebut sebagai unit kompilasi: batas package, bukan batas berkas, yang menentukan siapa boleh mengakses siapa.

Package main adalah kasus istimewa. Nama main memberi tahu toolchain Go bahwa package ini adalah sebuah program, bukan pustaka. Sebagai akibatnya, package main wajib memiliki fungsi main yang menjadi titik masuk eksekusi. Kombinasi package main dan func main inilah yang membuat berkas sederhana dapat berubah menjadi program yang berjalan.

Package main versus Package Library #

Kebanyakan package di ekosistem Go bukanlah program, melainkan pustaka yang menyediakan fungsi untuk diimpor package lain. Tabel berikut membandingkan keduanya:

Aspekpackage mainPackage library (mis. kalkulator)
Dapat dieksekusi langsungYa, melalui go run atau binaryTidak
Wajib punya func mainYaTidak
Hasil go buildBinary executableHanya verifikasi kompilasi
Cara dipakaiDijalankan langsungDiimpor oleh kode lain

Bentuk package library dapat kita lihat pada fragmen berikut:

go
package kalkulator

// Tambah menjumlahkan dua bilangan bulat.
func Tambah(a int, b int) int {
	return a + b
}

Fragmen tersebut tidak memiliki func main dan memang tidak membutuhkannya, karena package kalkulator hidup sebagai pustaka. Fungsi Tambah sengaja diawali huruf kapital agar dapat diakses oleh package yang mengimpornya; aturan huruf kapital ini dibahas tuntas di chapter Export dan Unexported . Konvensi penamaan package secara detail juga dibahas di section Package dan Module .

Ketika go build dijalankan pada package library, perintah tersebut hanya memverifikasi bahwa seluruh kode dapat dikompilasi lalu membuang hasilnya ke build cache; tidak ada binary yang dihasilkan karena pustaka tidak memiliki titik masuk untuk dijalankan. Perilaku ini akan terasa nyata ketika kita mulai membangun module multi-package di section Package dan Module .

Demo: Program dengan Package main #

Berkas package-main-demo.go pada folder chapter ini memperlihatkan program utuh bertanda package main:

go
package main

import "fmt"

func main() {
	fmt.Println("Saya program yang dapat dieksekusi.")
	fmt.Println("Package main dan fungsi main membuat saya layak berjalan.")
}

Output yang Dihasilkan:

text
Saya program yang dapat dieksekusi.
Package main dan fungsi main membuat saya layak berjalan.

Mari kita telaah baris demi baris program di atas:

  1. Baris 1 (package main): menandai berkas sebagai bagian dari program yang dapat dieksekusi, bukan pustaka.
  2. Baris 3 (import "fmt"): memuat package fmt untuk keperluan pencetakan teks.
  3. Baris 5 (func main() {): memenuhi syarat kedua program yang dapat dieksekusi, yaitu memiliki titik masuk bernama main.
  4. Baris 6-7 (fmt.Println(...)): dua statement yang mencetak pesan ke layar saat program dijalankan.

Program sekecil ini sudah memuat kedua syarat executable sekaligus. Jalankan dari folder chapter dengan go run package-main-demo.go, dan terminal mencetak dua baris pesan seperti pada blok output di atas. Bila salah satu syarat dihapus, misalnya package clause diganti nama lain, program berubah menjadi pustaka yang tidak lagi dapat dijalankan langsung.

Dua kata kunci main pada chapter ini, yaitu package main dan fungsi main, memang sengaja berbagi nama. Package main menandai program, sedangkan fungsi main menandai titik masuk. Peran titik masuk tersebut, termasuk bagaimana runtime memperlakukannya, adalah fokus chapter berikutnya.

Referensi #

Berkas Sumber

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

package-main-demo.go

Unduh berkas
go
package main

import "fmt"

func main() {
	fmt.Println("Saya program yang dapat dieksekusi.")
	fmt.Println("Package main dan fungsi main membuat saya layak berjalan.")
}