BAB 10: Seleksi Kondisi — if, else, dan switch

Gunakan hasil operator perbandingan dan logika dari bab sebelumnya untuk membuat program yang bisa bereaksi terhadap kondisi berbeda. Pelajari if, else, dan switch di Go.

Di akhir bab sebelumnya, kamu sudah bisa menghasilkan nilai true atau false dari operator perbandingan dan logika — tapi nilai itu masih hanya disimpan di variabel. Program belum bereaksi apapun berdasarkan nilai tersebut. Seleksi kondisi adalah mekanisme yang mengubah nilai bool itu menjadi tindakan nyata: jika kondisi ini terpenuhi, lakukan ini; jika tidak, lakukan itu.

Go menyediakan dua konstruksi untuk seleksi kondisi: if/else untuk percabangan berbasis ekspresi boolean, dan switch untuk memilih di antara banyak nilai yang spesifik. Keduanya akan muncul di hampir setiap program yang kamu tulis.

If dan Else

Bentuk paling sederhana dari if hanya menjalankan blok kode ketika kondisi bernilai true. Jika kondisinya false, blok tersebut dilewati sepenuhnya.

// main.go
package main

import "fmt"

func main() {
    nilai := 80

    if nilai >= 75 {
        fmt.Println("Selamat, kamu lulus!")
    }
}
Selamat, kamu lulus!

Untuk menangani kasus ketika kondisi tidak terpenuhi, tambahkan else:

// main.go
package main

import "fmt"

func main() {
    nilai := 65

    if nilai >= 75 {
        fmt.Println("Selamat, kamu lulus!")
    } else {
        fmt.Println("Maaf, kamu belum lulus.")
    }
}
Maaf, kamu belum lulus.

Else If untuk Banyak Kondisi

Ketika ada lebih dari dua kemungkinan, gunakan else if. Go mengevaluasi kondisi dari atas ke bawah dan berhenti di kondisi pertama yang true.

// main.go
package main

import "fmt"

func main() {
    nilai := 90

    if nilai >= 90 {
        fmt.Println("Predikat A")
    } else if nilai >= 75 {
        fmt.Println("Predikat B")
    } else if nilai >= 60 {
        fmt.Println("Predikat C")
    } else {
        fmt.Println("Predikat D")
    }
}
Predikat A

If dengan Inisialisasi

Go punya sintaks khusus yang memungkinkan mendeklarasikan variabel langsung di dalam kondisi if. Variabel tersebut hanya tersedia di dalam blok if/else itu, tidak bocor ke scope luar.

// main.go
package main

import "fmt"

func main() {
    if skor := hitungSkor(85, 90); skor >= 75 {
        fmt.Printf("Lulus dengan skor %d\n", skor)
    } else {
        fmt.Printf("Belum lulus, skor: %d\n", skor)
    }
    // variabel skor tidak bisa diakses di sini
}

func hitungSkor(uts, uas int) int {
    return (uts*40 + uas*60) / 100
}
Lulus dengan skor 88

Pola if nilai, err := ...; err != nil sangat umum di Go untuk menangani error sekaligus menggunakan nilai hasilnya. Kamu akan melihat pola ini terus menerus saat bekerja dengan file, database, atau HTTP.

Nested If

Kadang satu kondisi belum cukup — kamu perlu mengecek kondisi lain di dalamnya. Inilah nested if.

// main.go
package main

import "fmt"

func main() {
    umur := 20
    punyaSIM := true

    if umur >= 17 {
        if punyaSIM {
            fmt.Println("Boleh mengemudi.")
        } else {
            fmt.Println("Sudah cukup umur, tapi perlu mengurus SIM dulu.")
        }
    } else {
        fmt.Println("Belum cukup umur untuk mengemudi.")
    }
}
Boleh mengemudi.

Perhatikan bahwa contoh ini sebenarnya bisa disederhanakan dengan operator && yang kamu pelajari di bab sebelumnya: if umur >= 17 && punyaSIM. Nested if lebih berguna ketika pesan error di tiap level berbeda dan kamu ingin memberi feedback yang spesifik.

Switch

switch adalah alternatif if/else yang lebih rapi ketika kamu membandingkan satu variabel dengan banyak nilai spesifik. Di Go, switch tidak memerlukan break — setiap case berhenti secara otomatis.

// main.go
package main

import "fmt"

func main() {
    hari := "Senin"

    switch hari {
    case "Senin":
        fmt.Println("Awal minggu kerja")
    case "Jumat":
        fmt.Println("Akhir minggu kerja")
    case "Sabtu", "Minggu":
        fmt.Println("Akhir pekan")
    default:
        fmt.Println("Hari biasa")
    }
}
Awal minggu kerja

Satu case bisa menampung beberapa nilai sekaligus — pisahkan dengan koma, seperti "Sabtu", "Minggu" di atas.

Switch Tanpa Ekspresi

switch tanpa ekspresi berperilaku seperti rangkaian if/else if. Setiap case mengevaluasi kondisi boolean secara mandiri — berguna saat kondisinya tidak bisa dirumuskan sebagai perbandingan nilai tunggal.

// main.go
package main

import "fmt"

func main() {
    nilai := 85
    var predikat string

    switch {
    case nilai >= 90:
        predikat = "A"
    case nilai >= 75:
        predikat = "B"
    case nilai >= 60:
        predikat = "C"
    default:
        predikat = "D"
    }

    fmt.Printf("Predikat: %s\n", predikat)
}
Predikat: B

Fallthrough

Secara default, Go tidak melanjutkan ke case berikutnya setelah satu case dieksekusi. Jika kamu memang membutuhkan perilaku tersebut, gunakan fallthrough secara eksplisit.

// main.go
package main

import "fmt"

func main() {
    level := 2

    switch level {
    case 1:
        fmt.Println("Akses fitur dasar")
        fallthrough
    case 2:
        fmt.Println("Akses fitur lanjutan")
        fallthrough
    case 3:
        fmt.Println("Akses semua fitur")
    }
}
Akses fitur lanjutan
Akses semua fitur

fallthrough meneruskan ke case berikutnya tanpa memeriksa kondisinya. Jika kamu menggunakan fallthrough di case 2, blok case 3 akan selalu dijalankan meskipun nilai variabelnya tidak cocok. Gunakan hanya ketika benar-benar diperlukan.

Menggabungkan If dan Switch

Berikut contoh yang menggabungkan keduanya — melanjutkan kalkulator nilai dari bab sebelumnya dengan logika kelulusan yang lebih lengkap:

// main.go
package main

import "fmt"

func main() {
    nama := "Sari"
    nilaiUTS := 75
    nilaiUAS := 80
    kehadiran := 85 // persen (dari bab sebelumnya)

    // aritmatika dari Bab 9
    nilaiAkhir := (nilaiUTS*40 + nilaiUAS*60) / 100

    // syarat kelulusan
    syaratNilai := nilaiAkhir >= 70
    syaratKehadiran := kehadiran >= 80
    lulus := syaratNilai && syaratKehadiran

    // tentukan predikat dengan switch
    var predikat string
    switch {
    case nilaiAkhir >= 90:
        predikat = "A"
    case nilaiAkhir >= 75:
        predikat = "B"
    case nilaiAkhir >= 60:
        predikat = "C"
    default:
        predikat = "D"
    }

    fmt.Printf("Nama        : %s\n", nama)
    fmt.Printf("Nilai akhir : %d (Predikat %s)\n", nilaiAkhir, predikat)
    fmt.Printf("Kehadiran   : %d%%\n", kehadiran)

    if lulus {
        fmt.Println("Status      : LULUS")
    } else {
        if !syaratNilai {
            fmt.Println("Status      : TIDAK LULUS (nilai kurang)")
        } else {
            fmt.Println("Status      : TIDAK LULUS (kehadiran kurang)")
        }
    }
}
Nama        : Sari
Nilai akhir : 78 (Predikat B)
Kehadiran   : 85%
Status      : LULUS

Latihan

Latihan 1 — Tiket bioskop: Buat program dengan variabel umur dan punyaKTP. Gunakan nested if untuk menentukan: apakah seseorang boleh menonton film dewasa (17+), apakah perlu menunjukkan KTP, dan apa pesan yang ditampilkan jika ditolak.

Latihan 2 — Kalkulator diskon: Buat program yang menghitung total belanja setelah diskon. Gunakan switch tanpa ekspresi: diskon 20% jika total di atas 500.000, diskon 10% jika di atas 200.000, dan tanpa diskon jika di bawahnya. Tampilkan total sebelum dan sesudah diskon.

Latihan 3 — Klasifikasi BMI: Hitung BMI dari variabel beratKg dan tinggIm menggunakan rumus BMI = berat / (tinggi * tinggi). Gunakan switch tanpa ekspresi untuk mengklasifikasikan hasilnya: underweight (< 18.5), normal (18.5–24.9), overweight (25–29.9), dan obesitas (≥ 30). Pastikan menggunakan float64.

Seleksi kondisi memberi programmu kemampuan untuk bereaksi — tapi program yang benar-benar berguna seringkali harus mengulangi reaksi itu terhadap banyak data. Bagaimana kalau kamu perlu memeriksa nilai bukan satu siswa, melainkan seluruh kelas? Mengulang blok if secara manual jelas bukan solusi. Di bab berikutnya, kita akan mengenal perulangan — cara Go mengeksekusi satu blok kode berkali-kali secara otomatis.

Referensi

  1. 1If statements — The Go Programming Language Specification
  2. 2Switch statements — The Go Programming Language Specification
  3. 3If — A Tour of Go
  4. 4Switch — A Tour of Go