Setelah memahami package main, kita sampai pada pasangannya: fungsi main. Runtime Go tidak membaca seluruh program dari baris pertama seperti yang sering dibayangkan pemula. Runtime justru mencari satu fungsi bernama main di package main, lalu menjalankan isi fungsi tersebut sebagai titik masuk program. Semua fungsi lain hanya berjalan kalau dipanggil, baik secara langsung maupun tidak langsung dari main. Pada chapter ini kita amati alur eksekusi tersebut lewat program kecil dan pelajari bentuk wajib fungsi main.

main Sebagai Titik Masuk #

Spesifikasi Go mendefinisikan eksekusi program dengan dua langkah: inisialisasi package main, lalu pemanggilan fungsi main. Artinya, kedudukan fungsi main tidak ditentukan oleh posisinya di berkas. Fungsi main boleh dideklarasikan paling atas, paling bawah, atau di antara fungsi lain; runtime tetap memulai eksekusi dari fungsi main. Demo pada chapter ini sengaja menempatkan fungsi lain di atas main untuk membuktikan bahwa dideklarasikan lebih dulu tidak sama dengan dieksekusi lebih dulu. Inisialisasi package itu sendiri membahas variabel level package dan fungsi init, yang akan kita bahas di section Package dan Module .

Demo: Mengamati Alur Eksekusi #

Berkas fungsi-main-demo.go pada folder chapter ini memuat dua fungsi: sapaPengguna yang dideklarasikan lebih dulu, dan main di bawahnya:

go
package main

import "fmt"

func sapaPengguna() {
	fmt.Println("Halo, Siti!")
}

func main() {
	sapaPengguna()
	fmt.Println("Eksekusi kembali ke fungsi main")
	fmt.Println("Fungsi main selesai, program berakhir")
}

Output yang Dihasilkan:

text
Halo, Siti!
Eksekusi kembali ke fungsi main
Fungsi main selesai, program berakhir

Mari kita telaah baris demi baris program di atas:

  1. Baris 5 (func sapaPengguna() {): mendeklarasikan fungsi sapaPengguna tanpa parameter; deklarasi ini hanya mencatat bahwa fungsi tersebut ada, belum menjalankan apa pun.
  2. Baris 6 (fmt.Println("Halo, Siti!")): isi fungsi sapaPengguna yang baru dieksekusi ketika fungsi ini dipanggil.
  3. Baris 9 (func main() {): titik masuk program; runtime memulai eksekusi dari sini meskipun sapaPengguna dideklarasikan lebih dulu.
  4. Baris 10 (sapaPengguna()): statement pemanggilan fungsi; eksekusi melompat ke isi sapaPengguna, mencetak salam, lalu kembali ke main.
  5. Baris 11-12 (fmt.Println(...)): dua statement yang dijalankan setelah sapaPengguna selesai, dibuktikan oleh urutan output.

Urutan output pada blok di atas adalah bukti langsung alur eksekusinya. Baris Halo, Siti! tercetak lebih dulu karena pemanggilan sapaPengguna() berada sebelum dua statement fmt.Println lainnya. Setelah fungsi main selesai, program langsung berakhir; tidak ada kode lain yang dijalankan setelahnya.

Program Berakhir di main #

Program Go berhenti ketika fungsi main selesai. Runtime tidak melanjutkan ke fungsi lain yang belum dipanggil dan tidak membaca ulang berkas dari awal; semua statement di luar jalur eksekusi main tidak pernah berjalan. Seandainya kita menambahkan fungsi ketiga pada demo di atas tanpa memanggilnya, isi fungsi tersebut tidak akan pernah tercetak. Ketika main kembali, runtime melakukan pembersihan internal lalu melaporkan exit code 0 kepada sistem operasi, kecuali program memanggil os.Exit untuk memilih kode keluar yang lain. Karena itu, alur lengkap sebuah program Go hampir selalu dapat dipahami dengan membaca fungsi main dari atas ke bawah, lalu menelusuri setiap fungsi yang dipanggilnya.

Bentuk Wajib Fungsi main #

Fungsi main tidak menerima parameter dan tidak mengembalikan nilai. Bentuknya harus persis func main(). Bila kita menambahkan parameter, misalnya func main(argumen int), program tidak lagi dianggap memiliki titik masuk yang sah; compiler menolaknya dengan pesan func main must have no arguments and no return values. Penambahan nilai balik seperti func main() int ditolak dengan pesan yang sama. Penyampaian hasil program kepada sistem operasi memang tidak lewat nilai balik fungsi, melainkan lewat exit code yang dibahas di chapter Menjalankan Program .

Program yang hanya berisi fungsi main memang sudah sah, tetapi kode nyata hampir selalu membutuhkan kemampuan dari package lain. Fungsi fmt.Println yang kita pakai sejauh ini adalah contohnya: ia berasal dari package fmt yang harus diimpor lebih dulu. Mekanisme import inilah yang menjadi fokus chapter berikutnya.

Referensi #

Berkas Sumber

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

fungsi-main-demo.go

Unduh berkas
go
package main

import "fmt"

func sapaPengguna() {
	fmt.Println("Halo, Siti!")
}

func main() {
	sapaPengguna()
	fmt.Println("Eksekusi kembali ke fungsi main")
	fmt.Println("Fungsi main selesai, program berakhir")
}