if di Go tidak memakai tanda kurung di sekitar kondisi, selalu butuh kurung kurawal, dan bisa diawali pernyataan pendek yang mendeklarasikan variabel dengan scope khusus untuk if tersebut.
Kondisi diperiksa dari atas, dan cabang pertama yang bernilai true yang dijalankan. else if dan else bersifat opsional.
Aturan sintaks
Tiga aturan berbeda dari C, Java, dan JavaScript:
- Tanpa tanda kurung di sekitar kondisi.
if (x > 5)tetap bisa dikompilasi, tapigofmtakan menghapus tanda kurungnya. - Kurung kurawal wajib, bahkan untuk satu pernyataan. Tidak ada bentuk tanpa kurawal seperti
if x > 5 return. elseditulis di baris yang sama dengan kurung kurawal penutup. Go menyisipkan titik koma setelah}di akhir baris, jadi kode ini gagal:
if x > 5 {
fmt.Println("big")
}
else {
fmt.Println("small")
}
syntax error: unexpected keyword else, expected }
Tulis } else { dalam satu baris.
Kondisinya harus bertipe bool. Go tidak menganggap 0, "", atau nil sebagai false, jadi if count {} dan if name {} tidak bisa dikompilasi. Bandingkan secara eksplisit: if count > 0, if name != "", if user != nil.
Gabungkan kondisi dengan && (dan), || (atau), dan ! (bukan). && dan || sama-sama melakukan short-circuit, sehingga pemeriksaan nil menjadi aman:
if user != nil && user.IsAdmin() {
// user.IsAdmin() is only called when user is not nil
}
if dengan init statement
if bisa menjalankan satu pernyataan pendek sebelum kondisi, dipisahkan dengan titik koma. Variabel yang dideklarasikan di situ terlihat di setiap cabang if tersebut, dan tidak di mana pun setelahnya:
Pola ini menjaga variabel berumur pendek agar tidak masuk ke scope di sekitarnya. Kamu akan sering melihatnya pada pencarian map (v, ok := m[k]), type assertion (s, ok := v.(string)), dan error.
Sisi lainnya: kalau kamu butuh nilainya setelah if, deklarasikan sebelumnya. Kesalahan yang umum adalah menaruh hasil di init statement lalu mencoba memakainya di bawah.
Idiom if err != nil
Fungsi yang bisa gagal mengembalikan error di posisi terakhir. Periksa segera, tangani atau kembalikan, lalu lanjutkan jalur normal tanpa indentasi:
Perhatikan bahwa tidak ada else setelah if err != nil { return ... }. Gaya Go adalah menangani error, melakukan return, dan membiarkan alur normal tetap di margin kiri. Halaman tentang penanganan error membahas wrapping dan pemeriksaan tipe error.
Return lebih awal sebagai ganti percabangan bersarang
Blok if yang bersarang terlalu dalam sulit dibaca. Balik kondisinya dan lakukan return lebih awal; setiap pemeriksaan lalu terbaca sebagai penjaga (guard):
// Nested
func canCheckout(u *User, cart *Cart) bool {
if u != nil {
if u.Verified {
if len(cart.Items) > 0 {
return true
}
}
}
return false
}
// Guards
func canCheckout(u *User, cart *Cart) bool {
if u == nil || !u.Verified {
return false
}
if len(cart.Items) == 0 {
return false
}
return true
}
Programmer Go menyebut ini menjaga happy path tetap rata kiri. Linter seperti revive menandai else setelah blok yang diakhiri return, karena else itu menambah indentasi tanpa guna.
if/else vs switch
Rantai else if panjang yang menguji satu nilai terhadap beberapa kasus lebih enak dibaca sebagai switch. switch tanpa ekspresi bisa menggantikan rantai if/else if dengan kondisi apa pun:
switch {
case score >= 90:
return "A"
case score >= 80:
return "B"
default:
return "F"
}
Pakai if untuk satu atau dua cabang, dan switch begitu ada tiga cabang atau lebih.
Tidak ada operator ternary
Go tidak punya cond ? a : b. Lakukan assignment dengan if:
label := "odd"
if n%2 == 0 {
label = "even"
}
Halaman tentang operator ternary menjelaskan alasannya dan menunjukkan alternatifnya.
Kesalahan umum
- Shadowing dengan :=.
if x, err := f(); err == nil { ... }mendeklarasikanxbaru yang hanya berlaku untukifitu.xdi luar tidak ikut diperbarui. - Assignment di dalam kondisi.
if x = 5 {}adalah compile error (cannot use assignment x = 5 as value), bukan bug diam-diam seperti di C. Pakai==. - Membandingkan float dengan ==.
if total == 0.3gagal untuk nilai hasil perhitungan. Bandingkan dengan toleransi. - Memeriksa error yang salah. Setelah
a, err := f()danb, err := g(), pastikan setiapif err != nilberada tepat setelah pemanggilannya.
Pertanyaan yang sering diajukan
Bagaimana cara menulis if else di Go?
Tanpa tanda kurung di sekitar kondisi, dan kurung kurawal selalu wajib:
if x > 10 {
fmt.Println("big")
} else if x > 5 {
fmt.Println("medium")
} else {
fmt.Println("small")
}
else harus berada di baris yang sama dengan kurung kurawal penutup blok sebelumnya.
Apa itu pernyataan if dengan init statement di Go?
Pernyataan pendek sebelum kondisi, dipisahkan dengan titik koma: if n, err := strconv.Atoi(s); err != nil { ... }. Variabel yang dideklarasikan di sana hanya ada di dalam if beserta cabang else if dan else-nya, sehingga tidak bocor ke bagian lain fungsi.
Bisakah saya menulis if satu baris di Go?
Tidak tanpa kurung kurawal. if ok return dan if (ok) x = 1; adalah syntax error. Bentuk terpendeknya adalah if ok { return }, dan gofmt akan menaruh isinya di baris sendiri. Go juga tidak punya operator ternary, jadi nilai bersyarat butuh if/else atau fungsi bantu kecil.
Kenapa Go memakai if err != nil di mana-mana?
Go tidak punya exception. Fungsi yang bisa gagal mengembalikan error sebagai hasil terakhirnya, dan pemanggil langsung memeriksanya dengan if err != nil. Pengulangan itu adalah harga yang dibayar agar setiap titik kegagalan terlihat tepat di tempat terjadinya.