Program kecil masih mudah dibaca apa pun namanya, tetapi program yang tumbuh ratusan baris hidup atau mati oleh kualitas penamaannya. Nama variabel, fungsi, dan tipe adalah dokumentasi pertama yang dibaca setiap programmer — lebih dulu daripada komentar apa pun. Go menjaga pilihan gaya penamaan dengan sengaja ketat: satu konvensi resmi, bukan sekadar selera tim. Pada chapter penutup Section ini kita akan mempelajari aturan sintaks identifier, gaya camelCase dan PascalCase, serta arti penting kapitalisasi huruf pertama sebagai penanda exported dan unexported.
Aturan Sintaks Identifier #
Identifier adalah nama yang kita berikan untuk variabel, konstanta, fungsi, dan tipe. Sintaksnya bebas selama memenuhi tiga aturan: hanya boleh berisi huruf Unicode, digit, dan garis bawah _; tidak boleh diawali digit; dan tidak boleh sama dengan salah satu dari 25 kata kunci Go seperti func, var, atau if. Identifier bersifat case-sensitive — hitungDiskon, HitungDiskon, dan HITUNGDiskon adalah tiga nama yang berbeda, seperti sudah dibahas pada chapter Variabel
.
camelCase dan PascalCase #
Konvensi Go menggunakan gaya MixedCaps (huruf besar sebagai pemisah kata) — bukan snake_case. Pilihannya ditentukan satu pertanyaan: apakah identifier perlu dilihat dari luar package?
- camelCase (huruf pertama kecil): variabel lokal, konstanta lokal, fungsi internal —
totalBelanja,hitungDiskon,persenDiskon. - PascalCase (huruf pertama besar): identifier yang dibagikan ke package lain —
SapaPengguna,TaskManager,ParseConfig.
Garis bawah _ boleh muncul dalam nama (misalnya total_harga sah secara sintaks), tetapi komunitas Go hampir tidak pernah memakainya untuk variabel biasa. Pengecualian yang lazim hanyalah identifier khusus seperti _test.go pada berkas uji.
Exported dan Unexported #
Kapitalisasi huruf pertama bukan gaya kosmetik — ia adalah mekanisme visibilitas antar package. Identifier yang dimulai huruf kapital bersifat exported (bisa diakses package lain), sedangkan huruf kecil berarti unexported (hanya untuk package sendiri). Fungsi fmt.Println dapat kita panggil dari package main justru karena P-nya kapital; seandainya Go menamainya println, fungsi tersebut tak akan pernah terlihat dari luar package fmt.
Karena program kita masih berupa satu package main, perbedaan keduanya belum terasa praktis. Momen keputusannya tiba ketika kode mulai dipecah menjadi beberapa package — pembahasan tuntasnya menunggu chapter Export dan Unexported
.
Blank Identifier #
Nama _ menempati posisi istimewa: blank identifier bukan variabel sungguhan, melainkan penampung nilai yang sengaja dibuang. Kita sudah memakainya pada chapter Deklarasi Multiple
untuk melewatkan nilai balik fungsi, dan pola for _, v := range data akan sering muncul pada pembahasan slice dan map. Identifier ini boleh dipakai berulang kali karena isinya memang tidak pernah bisa dibaca.
Tabel Do dan Don’t #
| Contoh nama | Penilaian | Catatan |
|---|---|---|
hitungDiskon | Baik | camelCase, kata kerja, jelas maksudnya |
totalBelanja | Baik | camelCase, domain Indonesia sah dan jelas |
SapaPengguna | Baik | PascalCase, cocok untuk fungsi exported |
hd | Buruk | Singkatan tak bermakna; pembaca menebak-nebak |
hitung_diskon | Kurang | Sintaks sah, tetapi bukan gaya Go |
TotalBelanjaV2Final | Buruk | Nomor versi dan sufiks menumpuk kebingungan |
1nilai | Tidak sah | Dimulai dengan digit |
nama-lengkap | Tidak sah | Tanda minus bukan karakter identifier |
Prinsip Effective Go untuk nama yang baik: pendek, padat, dan mudah membangkitkan maknanya — bukan panjang dan deskriptif dengan embel-embel tipe seperti strNama atau iUmur. Nama bagus lahir dari konteks: umur di dalam fungsi yang jelas membahas pengguna sudah cukup; umurPengguna baru diperlukan saat fungsi tersebut membicarakan lebih dari satu entitas.
Program Utuh #
Berkas penamaan-demo.go menerapkan konvensi di atas dalam satu program kecil. Jalankan berkas tersebut dari direktori chapter:
go run penamaan-demo.gopackage main
import "fmt"
// hitungDiskon mengembalikan besarnya diskon dari total belanja.
// Unexported: huruf pertama kecil, hanya berguna di dalam package ini.
func hitungDiskon(totalBelanja int) int {
const persenDiskon = 10
return totalBelanja * persenDiskon / 100
}
// SapaPengguna exported: huruf pertama besar, bisa dipakai package lain.
func SapaPengguna(namaPengguna string) string {
return "Halo, " + namaPengguna + "!"
}
func main() {
totalBelanja := 250000
besarDiskon := hitungDiskon(totalBelanja)
fmt.Println(SapaPengguna("Siti"))
fmt.Println("Diskon:", besarDiskon)
fmt.Println("Bayar:", totalBelanja-besarDiskon)
}Output yang Dihasilkan:
Halo, Siti!
Diskon: 25000
Bayar: 225000Mari kita telaah baris demi baris program di atas:
- Baris 6 (
func hitungDiskon(totalBelanja int)): mendeklarasikan fungsi unexported dengan nama kata kerja camelCase; parametertotalBelanjamemakai camelCase untuk domain bisnis Indonesia. - Baris 8 (
const persenDiskon = 10): menamai konstanta lokal secara deskriptif dengan camelCase, bukan singkatan sepertipd. - Baris 13 (
func SapaPengguna(...)): mendeklarasikan fungsi exported karena huruf pertamanya kapital — meski baru berdampak saat ada package lain. - Baris 18–19: mendeklarasikan variabel lokal
totalBelanjadanbesarDiskonyang tipenya disimpulkan dari nilainya. - Baris 21–23: memanggil kedua fungsi lalu mencetak hasil perhitungan
250000 − 25000 = 225000.
Fondasi bahasa Go kini sudah lengkap: variabel, konstanta, tipe data, konversi, dan penamaan. Seluruh pengetahuan ini akan dipakai tanpa henti pada Section berikutnya ketika kita menggabungkan nilai-nilai menjadi ekspresi dan mengendalikan alur program dengan operator serta percabangan.
Referensi #
- Effective Go: Names — falsafah penamaan resmi dari tim Go.
- Spesifikasi Go: Exported identifiers — definisi teknis aturan kapitalisasi.
- Spesifikasi Go: Predeclared identifiers
— daftar nama yang sudah dipakai Go seperti
int,true, dannil.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
penamaan-demo.go
Unduh berkaspackage main
import "fmt"
// hitungDiskon mengembalikan besarnya diskon dari total belanja.
// Unexported: huruf pertama kecil, hanya berguna di dalam package ini.
func hitungDiskon(totalBelanja int) int {
const persenDiskon = 10
return totalBelanja * persenDiskon / 100
}
// SapaPengguna exported: huruf pertama besar, bisa dipakai package lain.
func SapaPengguna(namaPengguna string) string {
return "Halo, " + namaPengguna + "!"
}
func main() {
totalBelanja := 250000
besarDiskon := hitungDiskon(totalBelanja)
fmt.Println(SapaPengguna("Siti"))
fmt.Println("Diskon:", besarDiskon)
fmt.Println("Bayar:", totalBelanja-besarDiskon)
}