BAB 11: Perulangan dengan For Loop
Gunakan for loop untuk mengeksekusi blok kode berulang kali di Go. Pelajari tiga bentuk for, break, continue, nested loop, dan for range untuk memproses data secara efisien.
Di bab sebelumnya, kamu menulis latihan yang memeriksa nilai seorang siswa — satu siswa. Bayangkan kalau ada 30 siswa dan kamu harus menyalin blok if/switch itu 30 kali. Jelas bukan solusi yang baik. Perulangan adalah mekanisme yang menyelesaikan masalah ini: kamu tulis logikanya sekali, dan Go yang menjalankannya sebanyak yang diperlukan.
Go hanya memiliki satu keyword untuk perulangan: for. Tidak ada while, tidak ada do-while — tapi for di Go cukup fleksibel untuk menggantikan keduanya. Kamu akan melihat tiga bentuknya dan kapan masing-masing paling tepat digunakan.
Tiga Bentuk For Loop
For klasik dengan counter
Bentuk ini paling familiar — punya inisialisasi, kondisi, dan post statement yang dipisah titik koma.
// main.go
package main
import "fmt"
func main() {
for i := 1; i <= 5; i++ {
fmt.Printf("Iterasi ke-%d\n", i)
}
}
Iterasi ke-1
Iterasi ke-2
Iterasi ke-3
Iterasi ke-4
Iterasi ke-5
i := 1 dijalankan sekali di awal. Setiap iterasi, Go mengecek apakah i <= 5 masih true — jika ya, blok dijalankan, lalu i++ dieksekusi. Begitu kondisi false, loop berhenti.
For sebagai while
Ketika kamu hanya butuh kondisi tanpa counter eksplisit, cukup tulis kondisinya saja. Ini setara dengan while di bahasa lain.
// main.go
package main
import "fmt"
func main() {
stok := 5
for stok > 0 {
fmt.Printf("Stok tersisa: %d\n", stok)
stok--
}
fmt.Println("Stok habis.")
}
Stok tersisa: 5
Stok tersisa: 4
Stok tersisa: 3
Stok tersisa: 2
Stok tersisa: 1
Stok habis.
For tanpa kondisi (infinite loop)
for tanpa ekspresi apapun berjalan selamanya sampai ada perintah eksplisit untuk berhenti. Pola ini umum pada server atau aplikasi yang memang harus terus aktif.
// main.go
package main
import "fmt"
func main() {
percobaan := 0
for {
percobaan++
fmt.Printf("Percobaan ke-%d\n", percobaan)
if percobaan >= 3 {
fmt.Println("Batas percobaan tercapai.")
break
}
}
}
Percobaan ke-1
Percobaan ke-2
Percobaan ke-3
Batas percobaan tercapai.
Break dan Continue
break menghentikan loop sepenuhnya — eksekusi melompat ke baris setelah blok for. continue hanya melewati sisa iterasi saat ini dan langsung ke iterasi berikutnya.
// main.go
package main
import "fmt"
func main() {
fmt.Println("Angka ganjil di bawah 10:")
for i := 1; i < 10; i++ {
if i%2 == 0 {
continue // lewati angka genap
}
fmt.Printf(" %d\n", i)
}
fmt.Println("\nCari angka pertama yang habis dibagi 7:")
for i := 1; i <= 100; i++ {
if i%7 == 0 {
fmt.Printf(" Ditemukan: %d\n", i)
break // berhenti setelah menemukan
}
}
}
Angka ganjil di bawah 10:
1
3
5
7
9
Cari angka pertama yang habis dibagi 7:
Ditemukan: 7
Perhatikan penggunaan operator % (modulus) dari Bab 9 — ini contoh nyata bagaimana operator dan perulangan saling melengkapi.
Nested Loop
Loop di dalam loop berguna untuk masalah yang punya dua dimensi: tabel perkalian, pola baris-kolom, atau kombinasi data.
// main.go
package main
import "fmt"
func main() {
fmt.Println("Tabel perkalian 1-3:")
for baris := 1; baris <= 3; baris++ {
for kolom := 1; kolom <= 3; kolom++ {
fmt.Printf("%3d", baris*kolom)
}
fmt.Println()
}
}
Tabel perkalian 1-3:
1 2 3
2 4 6
3 6 9
Setiap level nested loop mengalikan jumlah iterasi. Dua loop 100 iterasi yang bersarang menghasilkan 10.000 operasi. Tiga level menghasilkan 1.000.000. Gunakan nested loop dengan sadar — jika kamu mulai punya tiga level, biasanya ada struktur data yang lebih tepat.
For Range
for range adalah cara idiomatik Go untuk mengiterasi koleksi data. Berbeda dari for klasik yang bekerja dengan counter angka, range langsung memberikan indeks dan nilai dari setiap elemen.
// main.go
package main
import "fmt"
func main() {
mahasiswa := [4]string{"Andi", "Sari", "Budi", "Rina"}
fmt.Println("Daftar mahasiswa:")
for i, nama := range mahasiswa {
fmt.Printf(" %d. %s\n", i+1, nama)
}
}
Daftar mahasiswa:
1. Andi
2. Sari
3. Budi
4. Rina
Jika kamu tidak butuh indeks, gunakan _ (blank identifier) untuk mengabaikannya:
// main.go
package main
import "fmt"
func main() {
nilai := [5]int{80, 75, 90, 85, 70}
total := 0
for _, n := range nilai {
total += n
}
rata := float64(total) / float64(len(nilai))
fmt.Printf("Total : %d\n", total)
fmt.Printf("Rata-rata: %.2f\n", rata)
}
Total : 400
Rata-rata: 80.00
_ (underscore) di Go adalah cara resmi untuk “buang nilai ini, saya tidak butuh”. Go tidak mengizinkan variabel yang dideklarasikan tapi tidak digunakan — jadi _ adalah solusinya. Kamu akan sering melihat pola ini.
Menggabungkan Loop dan Seleksi Kondisi
Kekuatan sesungguhnya terasa ketika loop dikombinasikan dengan if dari bab sebelumnya. Berikut versi kalkulator nilai yang memproses banyak siswa sekaligus — sesuatu yang mustahil dilakukan dengan hanya if/switch tanpa perulangan.
// main.go
package main
import "fmt"
func main() {
// data mahasiswa: nama, nilaiUTS, nilaiUAS
type Mahasiswa struct {
nama string
uts, uas int
}
kelas := [3]Mahasiswa{
{"Sari", 75, 80},
{"Budi", 55, 60},
{"Rina", 90, 95},
}
fmt.Println("Rekap Nilai Kelas:")
fmt.Println("------------------")
for _, mhs := range kelas {
// aritmatika dari Bab 9
nilaiAkhir := (mhs.uts*40 + mhs.uas*60) / 100
// seleksi kondisi dari Bab 10
var predikat string
switch {
case nilaiAkhir >= 90:
predikat = "A"
case nilaiAkhir >= 75:
predikat = "B"
case nilaiAkhir >= 60:
predikat = "C"
default:
predikat = "D"
}
status := "LULUS"
if nilaiAkhir < 70 {
status = "TIDAK LULUS"
}
fmt.Printf("%-6s | Nilai: %d (%s) | %s\n", mhs.nama, nilaiAkhir, predikat, status)
}
}
Rekap Nilai Kelas:
------------------
Sari | Nilai: 78 (B) | LULUS
Budi | Nilai: 58 (D) | TIDAK LULUS
Rina | Nilai: 93 (A) | LULUS
Latihan
Latihan 1 — FizzBuzz:
Tulis program yang mencetak angka 1 sampai 30. Jika angkanya habis dibagi 3, cetak “Fizz”. Jika habis dibagi 5, cetak “Buzz”. Jika habis dibagi keduanya, cetak “FizzBuzz”. Gunakan operator % dari Bab 9.
Latihan 2 — Akumulasi dengan kondisi:
Dari array [5]int{45, 82, 67, 91, 58}, hitung berapa siswa yang lulus (nilai >= 70) dan berapa yang tidak lulus. Tampilkan juga nilai tertinggi dan terendahnya.
Latihan 3 — Tabel perkalian dinamis:
Minta user menentukan ukuran tabel dengan variabel ukuran := 5, lalu cetak tabel perkalian ukuran x ukuran menggunakan nested loop. Pastikan angkanya terformat rapi dengan %4d.
Sejauh ini semua data yang kita proses — nama, nilai, stok — ditulis langsung di dalam kode sebagai array dengan ukuran tetap. Tapi program nyata jarang tahu di awal berapa banyak data yang akan datang: bisa 3 siswa, bisa 300. Di bab berikutnya kita akan berkenalan dengan slice — versi array yang ukurannya bisa tumbuh dan menyusut sesuai kebutuhan.