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.