Chapter 3 of 10
Setelah bab ini, Anda mampu:
if dan switch;for;range;break dan continue secara terukur;if, else if, dan ScopeKondisi if harus bernilai bool; Go tidak menganggap 0, string kosong, atau nil sebagai false secara implisit. Tanda kurung tidak diperlukan, sedangkan kurung kurawal wajib.
package main
import "fmt"
func kategori(nilai int) string {
if nilai >= 85 {
return "A"
} else if nilai >= 70 {
return "B"
}
return "C"
}
func main() {
fmt.Println(kategori(78))
}
Karena cabang pertama sudah return, else sebenarnya dapat dihilangkan untuk mengurangi indentasi.
if dapat memiliki pernyataan pendek yang scopenya terbatas pada seluruh rantai if:
package main
import (
"fmt"
"strconv"
)
func main() {
if n, err := strconv.Atoi("42"); err != nil {
fmt.Println("input tidak valid")
} else {
fmt.Println(n * 2)
}
}
switchswitch Go berhenti otomatis setelah satu kasus cocok; tidak memerlukan break. Beberapa nilai dapat berada dalam satu case.
package main
import "fmt"
func jenisHari(hari string) string {
switch hari {
case "Sabtu", "Minggu":
return "akhir pekan"
case "Senin", "Selasa", "Rabu", "Kamis", "Jumat":
return "hari kerja"
default:
return "tidak dikenal"
}
}
func main() {
fmt.Println(jenisHari("Sabtu"))
}
Switch tanpa ekspresi setara dengan switch true dan berguna untuk kondisi berurutan:
func suhuLabel(c float64) string {
switch {
case c < 0:
return "beku"
case c < 30:
return "sedang"
default:
return "panas"
}
}
Urutan kasus penting: kasus pertama yang benar dipilih. fallthrough ada, tetapi jarang dibutuhkan karena mengeksekusi kasus berikutnya tanpa memeriksa kondisinya.
forGo memakai for untuk seluruh bentuk perulangan.
package main
import "fmt"
func main() {
for i := 0; i < 3; i++ {
fmt.Println(i)
}
n := 3
for n > 0 {
fmt.Println(n)
n--
}
}
Perulangan tanpa kondisi berjalan sampai dihentikan:
for {
// hentikan dengan break, return, atau kondisi eksternal
break
}
Aliran keputusan loop:
rangerange menghasilkan pasangan indeks/nilai untuk slice dan array, serta key/value untuk map.
package main
import "fmt"
func main() {
nilai := []int{80, 90, 75}
total := 0
for i, n := range nilai {
fmt.Printf("nilai[%d]=%d\n", i, n)
total += n
}
fmt.Println("total:", total)
}
Gunakan blank identifier untuk hasil yang tidak dibutuhkan:
for _, n := range nilai {
fmt.Println(n)
}
Urutan iterasi map sengaja tidak ditentukan. Jangan mengandalkannya untuk output stabil; kumpulkan dan urutkan key terlebih dahulu jika urutan diperlukan.
Pada string, range menghasilkan indeks byte dan rune yang didekode. Pada slice nilai struct, variabel nilai adalah salinan; ubah elemen melalui indeks bila mutasi diperlukan:
for i := range nilai {
nilai[i] *= 2
}
break, continue, dan Labelcontinue melanjutkan iterasi berikutnya; break keluar dari loop atau switch terdekat.
package main
import "fmt"
func main() {
for n := 1; n <= 10; n++ {
if n%2 != 0 {
continue
}
if n > 6 {
break
}
fmt.Println(n)
}
}
Label berguna untuk keluar dari loop bersarang, tetapi sering kali fungsi kecil dan return lebih mudah dibaca:
package main
import "fmt"
func main() {
Luar:
for baris := 0; baris < 3; baris++ {
for kolom := 0; kolom < 3; kolom++ {
if baris == 1 && kolom == 1 {
break Luar
}
fmt.Println(baris, kolom)
}
}
}
n != 0.break rutin pada setiap case. Switch Go tidak jatuh ke kasus berikutnya secara default.range. Gunakan indeks untuk mengubah elemen slice.len(data), indeks valid adalah 0 sampai len(data)-1; kondisi lazim adalah i < len(data).if tidak tersedia setelah rantai tersebut.Fizz, 5 dengan Buzz, dan keduanya dengan FizzBuzz.if menangani keputusan boolean, sedangkan switch menyederhanakan banyak cabang dan berhenti otomatis. Semua perulangan memakai for; range memberi iterasi idiomatis atas koleksi dan string. Gunakan break, continue, dan label hanya ketika membuat alur lebih jelas, serta perhatikan scope, batas indeks, salinan nilai, dan urutan map yang tidak dijamin.