Sintaks Go untuk pendatang
Go sengaja dibuat kecil: 25 kata kunci, satu bentuk perulangan, tanpa exception, tanpa pewarisan. Materi ini memetakan yang berbeda dari bahasa lain, bukan mengajari cara memprogram.
Intisari
- Tipe ditulis setelah nama:
var n int, bukanint n. - Hanya ada satu kata perulangan โ
for.while,do, danforeachsemua ditulis denganfor. - Huruf besar di awal nama = diekspor (publik). Huruf kecil = hanya terlihat di dalam paketnya. Tidak ada
public/private. - Tidak ada exception. Error adalah nilai kembalian biasa, dan mengabaikannya adalah keputusan yang terlihat di kode.
- Import yang tidak dipakai dan variabel yang tidak dipakai adalah error kompilasi, bukan peringatan.
Bentuk kode yang akan kamu tulis
package katalog
import (
"errors"
"fmt"
"strings"
)
// Diekspor: huruf pertama besar. Bisa dipakai paket lain.
type Produk struct {
ID int64
Nama string
Harga int64 // rupiah, dalam satuan terkecil โ jangan pernah float untuk uang
}
// errStokHabis huruf kecil: hanya terlihat di dalam paket ini.
var errStokHabis = errors.New("stok habis")
// Method dengan receiver bernilai. Tipe pengembalian ditulis setelah parameter.
func (p Produk) Label() string {
return fmt.Sprintf("%s (Rp%d)", p.Nama, p.Harga)
}
// Dua nilai kembalian โ pola paling khas di Go.
func Cari(daftar []Produk, kata string) (Produk, error) {
for _, p := range daftar {
if strings.Contains(strings.ToLower(p.Nama), strings.ToLower(kata)) {
return p, nil
}
}
return Produk{}, fmt.Errorf("cari %q: %w", kata, errStokHabis)
}
Lima hal yang menyandung pendatang
| Kebiasaan lama | Di Go |
|---|---|
int x = 5; | var x int = 5, atau lebih sering x := 5 |
public class | Huruf besar di awal nama sudah berarti publik |
try { } catch { } | hasil, err := f() lalu if err != nil { ... } |
while (cond) | for cond { } |
| Import yang menganggur dibiarkan | Gagal kompilasi. Sengaja โ supaya berkas tidak menumpuk sampah |
Deklarasi: := versus var
x := 42 // hanya di dalam fungsi; tipe disimpulkan (int)
var y int // nilai nol: 0
var z = "halo" // tipe disimpulkan (string)
const Batas = 100 // konstanta, boleh di level paket
var ( // blok, untuk deklarasi paket
nama string
aktif bool
daftar []string
)
Tidak ada nilai "belum diisi" di Go. Setiap variabel yang dideklarasikan langsung punya
nilai nol: 0 untuk angka, "" untuk string, false untuk bool,
dan nil untuk pointer, slice, map, channel, fungsi, dan interface. Ini yang membuat
var buf bytes.Buffer langsung bisa dipakai tanpa konstruktor.
Jebakan := di dalam blok. := selalu membuat variabel baru di
scope tempat ia ditulis. Di dalam if atau for, ini artinya kamu bisa tanpa sadar
membayangi (shadow) variabel luar:
var err error
if kondisi {
hasil, err := hitung() // โ err BARU, yang di luar tetap nil
_ = hasil
}
// err di sini masih nil, apa pun yang terjadi di dalam if
go vet tidak selalu menangkap ini; golangci-lint dengan linter
shadow menangkapnya (Fase 8).
Satu kata untuk semua perulangan
for i := 0; i < 10; i++ { } // gaya C
for sisa > 0 { } // gaya while
for { break } // gaya loop tak terbatas
for i, huruf := range "halo" { } // range: indeks + rune
for i, p := range daftar { } // slice: indeks + salinan elemen
for kunci, nilai := range peta { } // map: URUTANNYA ACAK, disengaja
for range 5 { } // Go 1.22+: ulang 5 kali, tanpa variabel
Urutan range pada map sengaja diacak setiap kali program berjalan. Ini keputusan
desain untuk mencegah kode yang diam-diam bergantung pada urutan โ yang di implementasi lain akan berubah
saat versi naik. Kalau kamu butuh urutan, ambil kuncinya lalu slices.Sort.
Fungsi: banyak nilai kembalian
func bagi(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("pembagi nol")
}
return a / b, nil
}
hasil, err := bagi(10, 2)
if err != nil {
return err // pola yang akan kamu tulis ribuan kali
}
_, err = bagi(10, 0) // "_" membuang nilai secara eksplisit
Tanda _ (blank identifier) adalah cara Go memaksamu menyatakan bahwa
kamu sengaja mengabaikan sesuatu. Karena variabel tak terpakai adalah error kompilasi, tidak ada jalan
untuk "kelupaan" โ pengabaian selalu terlihat di diff.
defer: pembersihan yang tidak bisa lupa
func salin(dari, ke string) error {
src, err := os.Open(dari)
if err != nil {
return err
}
defer src.Close() // dijalankan saat fungsi keluar, lewat jalur mana pun
dst, err := os.Create(ke)
if err != nil {
return err // src.Close() tetap terpanggil
}
defer dst.Close()
_, err = io.Copy(dst, src)
return err
}
defer menjalankan panggilan saat fungsi selesai โ bukan saat blok selesai. Beberapa
defer dijalankan dengan urutan terbalik (tumpukan). Ini padanan Go untuk finally,
dan ia jauh lebih sulit dilupakan karena ditulis tepat di sebelah baris yang membuka sumber dayanya.
Jangan pakai defer di dalam for yang panjang. Semua penundaan menumpuk
sampai fungsinya selesai โ bukan sampai iterasinya selesai. Membuka seribu berkas dalam loop
dengan defer f.Close() berarti seribu berkas terbuka bersamaan. Bungkus badan loop jadi
fungsi sendiri.
Yang tidak ada di Go, dan penggantinya
| Tidak ada | Yang dipakai sebagai gantinya |
|---|---|
Exception / try-catch | Error sebagai nilai kembalian (Fase 1) |
| Pewarisan kelas | Komposisi struct + interface implisit (Fase 1) |
while, do-while | for |
Operator ternary ?: | if biasa โ sengaja, demi keterbacaan |
| Overloading fungsi & operator | Nama yang berbeda; generic kalau memang perlu |
| Parameter opsional / bernama | Struct opsi, atau pola functional options (Fase 5) |
| Anotasi / dekorator | Struct tag (untuk JSON, DB) + fungsi pembungkus |
Daftar di atas adalah fitur roadmap ini, bukan bug. Go dirancang untuk kode yang dibaca lebih sering daripada ditulis, oleh tim yang orangnya berganti. Konsekuensinya kode Go terasa bertele-tele saat ditulis dan sangat mudah dibaca enam bulan kemudian โ dan untuk aplikasi enterprise, itu pertukaran yang sengaja diambil.
Latihan: tulis fungsi Rata(angka []float64) (float64, error) yang mengembalikan error
kalau slice-nya kosong, lalu panggil dari main dengan slice kosong dan cetak errornya.
Setelah jalan, sengaja tambahkan satu import yang tidak dipakai dan satu variabel yang tidak dibaca โ baca
kedua pesan errornya sampai habis. Itu dua error kompilasi yang paling sering kamu temui bulan ini.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.