Struktur Kontrol Perulangan (Loops) di Go: Efisiensi, Fleksibilitas, dan Vibes Koding Makin Asik!

Go Loops: Efisiensi & Fleksibilitas Struktur Perulangan for

PPLG

PPLG

Penulis

11 Oct 2026
46 x dilihat

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. Kalau true, loop lanjut; kalau false, 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

  1. Pilih for...range untuk Iterasi Koleksi: Ini default terbaik karena lebih idiomatic Go dan seringkali lebih readable.
  2. Hati-hati dengan Copying Values di for...range:
    • Saat kamu for i, v := range slice, v itu adalah copy dari elemen di slice[i]. Jadi, kalau kamu modifikasi v, elemen asli di slice nggak akan berubah. Kalau mau ubah elemen asli, pake slice[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.
  3. 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) atau make(map[string]int, capacity)). Ini menghindari re-allocation memori berulang kali yang bikin lambat.
  4. 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!
  5. Gunakan for {} dengan Bijak: Infinite loop itu kuat, tapi pastikan ada mekanisme break atau return yang jelas biar program nggak stuck. Sering dipaduin sama select buat handle goroutine dan channel yang keren.
  6. for...range String itu rune, bukan byte: Ingat ya, Go memperlakukan string sebagai urutan byte yang mewakili karakter Unicode. for...range string 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!


0.0

Berikan Rating

Komentar (0)

Silakan login untuk memberikan komentar.

Login Sekarang

Belum ada komentar. Jadilah yang pertama!

Menyukai Artikel (2)