Go Loops: Efisiensi & Fleksibilitas Struktur Perulangan for
Halo gaes! Ngomongin Go Lang, pasti nggak jauh-jauh dari koding yang clean, powerful, dan efficient. Nah, salah satu core building block yang wajib banget kamu kuasai biar kodinganmu makin GG adalah looping atau perulangan. Di Go, kita punya cara unik buat handle perulangan ini, beda banget sama bahasa lain yang kadang punya while, do-while, atau for-each terpisah. Di Go, semua itu ngumpul jadi satu di keyword for doang! Keren, kan?
Yuk, kita spill tuntas gimana Go ngatur perulangan biar kodinganmu makin fleksibel dan tentunya super efisien. Skuy!
Kenalan Sama for di Go: Satu Kata, Sejuta Makna
Betul sekali, ngab! Di Go, cuma ada satu keyword buat semua jenis perulangan: for. Ini filosofi desain Go yang memang suka kesederhanaan tapi tetap powerful. Nggak ribet, semua vibes perulangan bisa di-cover cuma pake for.
Ada beberapa "rasa" dari for ini yang harus kamu tahu:
1. for Klasik (Mirip C-style Loop)
Ini template for yang paling umum dan mungkin sering kamu temui di bahasa lain. Punya tiga bagian utama: inisialisasi, kondisi, dan post-statement.
for inisialisasi; kondisi; post-statement {
// Kode yang akan diulang
}
inisialisasi: Dieksekusi sekali di awal loop. Biasanya buat deklarasi dan inisialisasi variabel counter.kondisi: Dievaluasi sebelum setiap iterasi. Kalautrue, loop lanjut; kalaufalse, loop berhenti.post-statement: Dieksekusi setelah setiap iterasi loop. Biasanya buat increment atau decrement counter.
Contoh Kode:
package main
import "fmt"
func main() {
fmt.Println("Ini for klasik, ngab!")
for i := 0; i < 5; i++ {
fmt.Printf("Iterasi ke-%d\n", i)
}
// Kamu juga bisa skip inisialisasi atau post-statement kalo udah ada di luar
j := 0
for ; j < 3; j++ { // Inisialisasi di luar
fmt.Printf("Iterasi j ke-%d\n", j)
}
k := 0
for k < 3 { // Mirip 'while', post-statement di dalam
fmt.Printf("Iterasi k ke-%d\n", k)
k++
}
}
2. for Mirip while Loop
Kalo kamu cuma butuh kondisi doang, for di Go bisa bertindak kayak while loop di bahasa lain. Cukup isi bagian kondisi aja.
for kondisi {
// Kode yang akan diulang
}
Contoh Kode:
package main
import (
"fmt"
"time"
)
func main() {
total := 0
// Loop ini akan terus berjalan selama total kurang dari 10
for total < 10 {
fmt.Printf("Total sekarang: %d\n", total)
total += 2
time.Sleep(100 * time.Millisecond) // Biar keliatan ada jeda, gaes
}
fmt.Println("Loop 'while-style' selesai! Total akhir:", total)
}
3. for Tanpa Batas (Infinite Loop)
Butuh loop yang jalan terus-menerus sampai dihentikan secara eksplisit (misal pake break atau programnya exit)? for {} jawabannya! Ini sering banget dipake buat server, daemon, atau background worker yang memang harus listen terus.
for {
// Kode yang akan diulang tanpa henti
// Harus ada kondisi 'break' di dalamnya kalo nggak mau nge-hang!
}
Contoh Kode:
package main
import (
"fmt"
"time"
)
func main() {
counter := 0
fmt.Println("Mulai infinite loop... hati-hati, ngab!")
for {
fmt.Printf("Udah jalan %d detik...\n", counter)
time.Sleep(1 * time.Second)
counter++
if counter >= 5 {
fmt.Println("Udah cukup nih, cabut dulu pake break!")
break // Penting! Kalo nggak ada ini, loop jalan terus
}
}
fmt.Println("Infinite loop selesai.")
}
4. for...range Loop: Jagoan Iterasi Koleksi
Ini dia favorit banyak Gopher! for...range bikin iterasi koleksi data (macam slice, array, string, map, atau channel) jadi super gampang dan readable.
for index, value := range collection {
// Kode yang akan diulang
}
index: Indeks atau kunci dari elemen saat ini (opsional).value: Nilai elemen saat ini (opsional).
Kamu bisa skip index atau value kalo nggak dipake, cukup pake _ (underscore) buat discard variabelnya.
Contoh Kode:
package main
import "fmt"
func main() {
// Iterasi Slice/Array
fmt.Println("\n--- Iterasi Slice ---")
fruits := []string{"apel", "pisang", "mangga"}
for i, fruit := range fruits {
fmt.Printf("Buah ke-%d: %s\n", i, fruit)
}
// Iterasi Map
fmt.Println("\n--- Iterasi Map ---")
scores := map[string]int{"Alice": 90, "Bob": 85, "Charlie": 92}
for name, score := range scores {
fmt.Printf("%s dapat nilai %d\n", name, score)
}
// Iterasi String (per rune, bukan byte)
fmt.Println("\n--- Iterasi String ---")
message := "Halo Go! 👋"
for i, r := range message {
fmt.Printf("Index %d: Karakter '%c' (Unicode: %U)\n", i, r, r)
}
// Iterasi Channel (akan terus menerima sampai channel ditutup)
fmt.Println("\n--- Iterasi Channel ---")
ch := make(chan int)
go func() { // Goroutine buat ngirim data ke channel
for i := 0; i < 3; i++ {
ch <- i * 10
time.Sleep(50 * time.Millisecond)
}
close(ch) // Penting! Tutup channel kalo udah selesai ngirim data
}()
for v := range ch { // Akan block sampai ada data atau channel ditutup
fmt.Printf("Dapet dari channel: %d\n", v)
}
fmt.Println("Channel sudah ditutup, loop selesai.")
}
Kontrol Perulangan: break, continue, dan goto (Tapi Jangan Sering-sering)
Buat ngatur flow di dalam loop, kita punya beberapa pernyataan:
break: Langsung keluar dari loop terdekat.continue: Melewatkan sisa iterasi saat ini dan langsung lanjut ke iterasi berikutnya.goto: Melompat ke label tertentu. Ini powerful tapi juga bisa bikin kodinganmu jadi spaghetti code, jadi HINDARI sebisa mungkin ya, gaes! Kalo terpaksa banget, pikirkan baik-baik.
Contoh Kode break dan continue:
package main
import "fmt"
func main() {
fmt.Println("\n--- Contoh break dan continue ---")
for i := 0; i < 10; i++ {
if i%2 != 0 { // Kalo bilangan ganjil
continue // Skip, langsung ke iterasi berikutnya
}
if i == 8 {
break // Kalo udah 8, stop loop
}
fmt.Printf("Angka genap: %d\n", i)
}
fmt.Println("Loop selesai karena break atau sudah habis.")
}
Labels: Kontrol Loop Multilevel (Buat Kasus Khusus)
Kadang kita punya nested loops (loop di dalam loop), dan butuh break atau continue dari loop yang paling luar. Di sinilah labels berperan. Kamu bisa kasih nama (label) ke loop-mu, lalu pake break atau continue dengan nama label tersebut.
package main
import "fmt"
func main() {
fmt.Println("\n--- Contoh Labels ---")
OuterLoop: // Ini label untuk loop luar
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
fmt.Printf("i: %d, j: %d\n", i, j)
if i == 1 && j == 1 {
fmt.Println("Ketemu kondisi, break dari OuterLoop!")
break OuterLoop // Keluar dari loop 'OuterLoop'
}
}
}
fmt.Println("Keluar dari OuterLoop.")
}
Ini powerful, tapi make sure kodinganmu tetap clear dan readable ya! Jangan sampai bikin bingung temen setimmu.
Tips Praktis Biar Kodingan Go-mu Makin Efisien dan Fleksibel
- Pilih
for...rangeuntuk Iterasi Koleksi: Ini default terbaik karena lebih idiomatic Go dan seringkali lebih readable. - Hati-hati dengan Copying Values di
for...range:- Saat kamu
for i, v := range slice,vitu adalah copy dari elemen dislice[i]. Jadi, kalau kamu modifikasiv, elemen asli di slice nggak akan berubah. Kalau mau ubah elemen asli, pakeslice[i] = newValue. - Khusus struct yang besar, copying ini bisa jadi overhead. Pertimbangkan iterasi berdasarkan indeks atau gunakan pointer jika memang perlu modifikasi elemen dan struct-nya besar.
- Saat kamu
- Pre-allocate Kapasitas Slice/Map: Kalau kamu tahu berapa banyak elemen yang akan ditambahkan ke slice atau map di dalam loop, pre-allocate kapasitasnya (
make([]int, 0, capacity)ataumake(map[string]int, capacity)). Ini menghindari re-allocation memori berulang kali yang bikin lambat. - Hindari Operasi Berat di Dalam Loop: Kalau ada komputasi yang bisa dihitung sekali di luar loop, lakukan di luar. Jangan hitung ulang di setiap iterasi!
- Gunakan
for {}dengan Bijak: Infinite loop itu kuat, tapi pastikan ada mekanismebreakataureturnyang jelas biar program nggak stuck. Sering dipaduin samaselectbuat handle goroutine dan channel yang keren. for...rangeString iturune, bukanbyte: Ingat ya, Go memperlakukan string sebagai urutan byte yang mewakili karakter Unicode.for...rangestring akan mengiterasi rune (titik kode Unicode), bukan byte. Ini penting kalo kamu lagi handle multibyte characters.
Kesimpulan: Kuasai for dan Jadilah Gopher Sejati!
Nah, itu dia gaes, spill tuntas soal struktur kontrol perulangan di Go Lang. Dengan cuma satu keyword for, Go berhasil nyediain semua fleksibilitas dan efisiensi yang kita butuhin. Dari loop klasik, loop ala while, sampai iterasi koleksi yang super nyaman pake for...range.
Menguasai for ini bukan cuma soal bisa koding, tapi juga soal bikin kodinganmu jadi lebih clean, efficient, dan punya Go vibes yang kental. Jadi, jangan males eksplorasi dan coba-coba semua flavor dari for ini ya. Tetap semangat ngoding, gaes! Salam Gopher!
Berikan Rating
Komentar (0)
Silakan login untuk memberikan komentar.
Login SekarangKata Kunci
Belum ada komentar. Jadilah yang pertama!