For Loop — Go

For Loop di Go Go hanya punya satu jenis loop: for. Tidak ada while atau do-while — semua bisa dilakukan dengan for. For Klasik for i := 0; i < 5; i++ {…

Loop menjalankan blok kode yang sama berkali-kali, dengan sesuatu yang berubah di tiap putaran. Bayangin Mas Bimo memanggil antrean di Warung Bakso Mas Bimo: "Antrean nomor 1! Antrean nomor 2! Antrean nomor 3!" Kalimatnya sama, cuma nomornya yang naik, dan dia berhenti begitu antreannya habis. Di Go, semua perulangan ditulis dengan satu kata kunci saja: for.

🧪 Tebakan cepat: for nomor := 1; nomor < 3; nomor++ memanggil berapa nomor antrean: 2, 3, atau 4? Tebak dulu, jawabannya ada di bagian "for tiga bagian".

Go cuma punya satu loop: for

JavaScript punya for, while, dan do...while. Go cuma punya for; kata while gak ada sama sekali. Satu kata kunci itu dipakai dalam empat bentuk:

Bentuk Ditulis Dipakai untuk
Tiga bagian for i := 0; i < 3; i++ { } jumlah putaran sudah jelas
Kondisi saja for stok > 0 { } "selama", pengganti while
Tanpa apa-apa for { } jalan terus sampai ketemu break
range for i, m := range menu { } menelusuri isi slice, string, map, atau angka

Kurung kurawal { } wajib, dan { harus di baris yang sama dengan for. Kurung biasa ( ) di sekitar bagian-bagiannya gak dipakai.

for tiga bagian

package main

import "fmt"

func main() {
	for nomor := 1; nomor <= 3; nomor++ {
		fmt.Println("Antrean nomor", nomor)
	}
}
Antrean nomor 1
Antrean nomor 2
Antrean nomor 3
Putaran nomor nomor <= 3 Yang terjadi
1 1 true cetak Antrean nomor 1, nomor jadi 2
2 2 true cetak Antrean nomor 2, nomor jadi 3
3 3 true cetak Antrean nomor 3, nomor jadi 4
- 4 false loop berhenti

Syaratnya dicek 4 kali untuk 3 baris output. Dengan nomor < 3, cek ketiga (3 < 3) sudah false, jadi cuma nomor 1 dan 2 yang dipanggil: 2 nomor. Itu jawaban tebakannya.

for dengan kondisi saja (pengganti while)

stok := 3
for stok > 0 {
	fmt.Println("Sisa stok:", stok)
	stok--
}
fmt.Println("Bakso habis!")
Sisa stok: 3
Sisa stok: 2
Sisa stok: 1
Bakso habis!

break dan continue

for nomor := 1; nomor <= 5; nomor++ {
	if nomor == 2 {
		continue // nomor 2 belum datang: lewati
	}
	if nomor == 4 {
		break // warung tutup: berhenti total
	}
	fmt.Println("Antrean nomor", nomor)
}

Output-nya cuma Antrean nomor 1 dan Antrean nomor 3. continue melompati sisa putaran ini lalu lanjut ke putaran berikutnya. break keluar dari loop saat itu juga, jadi nomor 4 dan 5 gak pernah diproses.

range: telusuri isinya satu per satu

menu := []string{"Bakso urat", "Mie ayam", "Es teh"}
for i, m := range menu {
	fmt.Println(i, m) // 0 Bakso urat, lalu 1 Mie ayam, lalu 2 Es teh
}

menu adalah slice, daftar yang isinya berurutan (detailnya di lesson Array & Slice). range memberi dua nilai di tiap putaran: index (mulai dari 0) dan isinya. Jadi nums := []int{10, 20, 30} dengan for i, v := range nums { fmt.Println(i, v) } mencetak tiga baris: 0 10, 1 20, 2 30.

Gabungkan loop dengan if: FizzBuzz

FizzBuzz adalah permainan hitung: sebut 1, 2, 3, dan seterusnya, tapi kelipatan 3 diganti Fizz, kelipatan 5 diganti Buzz, dan kelipatan 3 sekaligus 5 (kelipatan 15) diganti FizzBuzz. Kelipatan dicek dengan %, sisa bagi: 9 % 3 hasilnya 0, jadi 9 kelipatan 3.

for i := 1; i <= 15; i++ {
	if i%15 == 0 {
		fmt.Println("FizzBuzz")
	} else if i%3 == 0 {
		fmt.Println("Fizz")
	} else if i%5 == 0 {
		fmt.Println("Buzz")
	} else {
		fmt.Println(i)
	}
}
i i%15 i%3 i%5 Tercetak
1 1 1 1 1
3 3 0 3 Fizz
5 5 2 0 Buzz
15 0 0 0 FizzBuzz

Urutan cek-nya penting: if berhenti di syarat pertama yang true. Kalau i%3 == 0 dicek duluan, 15 mencetak Fizz dan gak pernah sampai ke FizzBuzz. Angka biasa dicetak dari variabelnya, fmt.Println(i), bukan diketik satu per satu.

📌 Sejak Go 1.22: tiap putaran punya variabelnya sendiri

Sampai Go 1.21, i di for i := 0; i < 3; i++ adalah satu variabel yang dipakai bergantian oleh semua putaran. Kode yang menyimpan i untuk dipakai belakangan (misalnya function kecil yang dibuat di dalam loop lalu dijalankan sesudah loop selesai) semuanya melihat nilai terakhir dan mencetak 3 3 3. Sejak Go 1.22, tiap putaran punya i sendiri, jadi hasilnya 0 1 2. Aturan ini berlaku kalau baris go di file go.mod proyekmu 1.22 atau lebih baru.

⚠️ Jebakan yang sering ketemu

TL;DR: Go cuma punya for. for awal; syarat; langkah { } untuk jumlah putaran yang jelas, for syarat { } sebagai pengganti while, for { } jalan terus sampai break, dan for i, v := range x { } menelusuri slice, string, map, atau angka (index mulai 0, _ untuk nilai yang gak dipakai). Syarat dicek sebelum tiap putaran, continue melompati satu putaran, break keluar dari loop. Sejak Go 1.22 tiap putaran punya variabel loop sendiri.

Yang akan kamu pelajari