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
nomor := 1: nilai awal, dijalankan sekali sebelum putaran pertama. Variabelnomorcuma hidup di dalam loop ini.nomor <= 3: syarat, dicek sebelum tiap putaran. Selamatrue, isi{ }jalan.nomor++: langkah, dijalankan sesudah tiap putaran.++artinya tambah 1.fmt.Println("Antrean nomor", nomor)mencetak teks dan angkanya dengan spasi di antaranya, lalu pindah baris.
| 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!
for stok > 0cuma punya syarat, persiswhile (stok > 0)di JavaScript.stok--artinya kurangi 1. Tanpa baris inistokselamanya 3, syaratnya selalutrue, dan program mencetakSisa stok: 3terus-menerus sampai kamu hentikan sendiri dengan Ctrl+C. Go gak punya batas waktu yang menghentikannya.- Tanpa syarat sama sekali,
for { }berputar selamanya. Keluar dari situ denganbreak.
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.
- Gak butuh index? Tulis
_di tempatnya:for _, m := range menu. Go menolak variabel yang gak dipakai:for i, m := range menutanpa memakaiigagal compile dengandeclared and not used: i. - Cuma butuh index? Tulis satu variabel:
for i := range menu. - Sejak Go 1.22,
rangejuga bisa ke angka:for i := range 3berputar dengani= 0, 1, 2. rangeke string memberi posisi byte dan karakternya.for i, r := range "André"berputar 5 kali walaulen("André")6, karenaémakan 2 byte. Putaran terakhirnya4 233: 233 adalah kode hurufé.rangeke map memberi key dan value, tapi urutannya gak tetap (lihat lesson Map).
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
<padahal maksudnya<=.for i := 1; i < 20; i++berhenti di 19. Untuk 1 sampai 20, tulisi <= 20.- Lupa mengubah variabel di for kondisi. Tanpa
stok--, syaratnya selalutruedan program gak pernah selesai. - Nulis
whileatau kurung ala JavaScript.while stok > 0danfor (i := 0; i < 3; i++)gagal compile. Di Go semuanyafor, tanpa kurung. - Urutan FizzBuzz. Cek kelipatan 15 (atau
i%3 == 0 && i%5 == 0) paling atas, sebelum kelipatan 3 dan 5.
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.