โ† Semua pembelajaran / Go Nol โ†’ Enterprise
Fase 0 ยท Fondasi Go & Tooling

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.

Sumber asli go.dev Resmi Rangkuman ~9 menit baca

Intisari

  • Tipe ditulis setelah nama: var n int, bukan int n.
  • Hanya ada satu kata perulangan โ€” for. while, do, dan foreach semua ditulis dengan for.
  • 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 lamaDi Go
int x = 5;var x int = 5, atau lebih sering x := 5
public classHuruf besar di awal nama sudah berarti publik
try { } catch { }hasil, err := f() lalu if err != nil { ... }
while (cond)for cond { }
Import yang menganggur dibiarkanGagal 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 adaYang dipakai sebagai gantinya
Exception / try-catchError sebagai nilai kembalian (Fase 1)
Pewarisan kelasKomposisi struct + interface implisit (Fase 1)
while, do-whilefor
Operator ternary ?:if biasa โ€” sengaja, demi keterbacaan
Overloading fungsi & operatorNama yang berbeda; generic kalau memang perlu
Parameter opsional / bernamaStruct opsi, atau pola functional options (Fase 5)
Anotasi / dekoratorStruct 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.