18. Perulangan
Cara lain untuk berhenti mengulang tulisan sendiri adalah
perulangan: blok kode yang berjalan berulang-ulang. Bab
03 dan 04 menunjukkan bahwa Go hanya punya satu kata kunci perulangan,
yaitu for. for hadir dalam beberapa bentuk,
ditambah break untuk berhenti lebih awal dan
continue untuk melewati satu putaran. Semuanya dibahas di
sini.
for dengan
kondisi: ulangi selama benar
Bentuk yang paling dasar hanya punya kondisi. Go memeriksanya, menjalankan blok kalau benar, lalu memeriksa lagi, berulang sampai kondisinya salah.
count := 10
for count > 0 {
fmt.Println(count)
count = count - 1
}
fmt.Println("Blast off!")Urutan jalannya:
- Periksa
count > 0. Nilainya10, jadi benar. - Cetak
10, ubahcountmenjadi9. - Kembali ke langkah 1.
countbernilai9, masih benar. Cetak, kurangi satu. - Ulangi sampai
countbernilai0. Kondisinya gagal, perulangan keluar, danfmt.Println("Blast off!")berjalan sekali.
Aturan dari if berlaku di sini: tanpa tanda kurung, dan
{ tetap di baris yang sama. Ini adalah
exercises/18/02-countdown.go.
Di dalam isi perulangan, ubah nilai yang dipakai kondisi, atau perulangan tidak pernah berakhir. Perulangan tanpa akhir mengunci terminal. Hentikan dengan Ctrl + C.
Cara lebih pendek untuk mengubah variabel
Perulangan terus-menerus mengubah variabel, jadi Go punya bentuk
pendek. i++ menambah 1 ke i, yang sudah kamu
lihat sejak Bab 04. i-- mengurangi 1. +=,
-=, dan *= menerapkan operasi pada variabel
itu sendiri, jadi total += 5 berarti
total = total + 5. += juga menyambung
string:
score := 10
score++
fmt.Println(score) // 11
score--
score--
fmt.Println(score) // 9
score += 5
fmt.Println(score) // 14
score -= 4
fmt.Println(score) // 10
score *= 3
fmt.Println(score) // 30
line := "ab"
line += "c"
fmt.Println(line) // abcscore++ adalah pernyataan di barisnya sendiri. Ia tidak
memberikan nilai, jadi kamu tidak bisa menulisnya di dalam
fmt.Println.
for
tiga bagian: ulangi sejumlah kali yang diketahui
Ini bentuk yang tepat ketika kamu tahu berapa kali harus mengulang. Kamu sudah bertemu dengannya di Bab 04:
for i := 1; i <= 5; i++ {
fmt.Println(i)
}Output:
1
2
3
4
5
Ketiga bagian dipisahkan titik koma:
i := 1berjalan sekali, sebelum putaran pertama.i <= 5adalah kondisi, diperiksa sebelum setiap putaran.i++berjalan setelah setiap putaran.
Perhatikan nilai akhirnya. i <= 5 menyertakan 5, dan
i < 5 berhenti di 4. Selisih satu seperti ini adalah bug
perulangan yang paling umum, jadi baca kondisinya dengan teliti. Untuk
perulangan dari 1 sampai 10, tulis i <= 10.
Variabel yang dideklarasikan di bagian pertama hanya ada di dalam perulangan. Memakainya sesudah itu berhenti dengan:
for i := 1; i <= 3; i++ {
fmt.Println(i)
}
fmt.Println(i)undefined: i
Kalau kamu butuh penghitungnya setelah perulangan, deklarasikan sebelum perulangan, seperti pada bentuk dengan kondisi.
Langkah
Bagian ketiga menentukan bagaimana penghitung berubah setiap putaran. Ubah untuk melompat atau menghitung mundur:
for i := 0; i <= 100; i += 10 {
fmt.Print(i, " ")
}
fmt.Println()
for i := 10; i > 0; i-- {
fmt.Print(i, " ")
}
fmt.Println()Output:
0 10 20 30 40 50 60 70 80 90 100
10 9 8 7 6 5 4 3 2 1
Arahnya harus cocok dengan kondisinya.
for i := 10; i > 0; i++ mulai di atas nol dan terus
naik, dan i += 0 sama sekali tidak mengubah i.
Go menerima keduanya, dan perulangannya tidak berakhir saat yang kamu
maksud.
fmt.Print(i, " ") mencetak nilai dan spasi, tanpa baris
baru. fmt.Println() kosong di akhir pindah ke baris baru.
Contoh-contoh ini ada di exercises/18/04-step.go.
Buka exercises/18/01-for-table.go. File ini mencetak
tabel perkalian 7, dari 7 * 1 sampai 7 * 10.
Ubah supaya mencetak tabel angka lain.
for kosong dengan
break
Perulangan apa pun bisa dihentikan lebih awal dengan
break, yang langsung melompat ke kode sesudah perulangan.
for tanpa apa-apa di belakangnya tidak punya jalan keluar
bawaan, dan satu-satunya jalan keluar adalah break:
n := 1
for {
if n*n > 100 {
break
}
n++
}
fmt.Println("First number whose square is over 100 is", n)Output:
First number whose square is over 100 is 11
Pakai for kosong ketika pemeriksaan keluar tidak muat
dalam satu kondisi di bagian atas. Ini adalah
exercises/18/05-break.go.
Di dalam switch, break keluar dari
switch, bukan dari perulangan di sekitarnya:
for i := 1; i <= 3; i++ {
switch i {
case 2:
fmt.Println("break here")
break
}
fmt.Println("after the switch, i is", i)
}Output:
after the switch, i is 1
break here
after the switch, i is 2
after the switch, i is 3
Perulangannya berjalan terus. Kalau perulangan harus berakhir dari
dalam sebuah keputusan, pakai rantai if untuk keputusan
itu.
Berjalan setidaknya sekali
Terkadang isi perulangan harus berjalan setidaknya sekali sebelum
pemeriksaan. Pakai for kosong dengan break di
akhir:
count := 1
for {
fmt.Println(count)
count++
if count > 5 {
break
}
}Output:
1
2
3
4
5
break di bawah keluar begitu kondisinya terpenuhi. Ini
bentuk untuk menanyakan sesuatu kepada pengguna: kamu harus bertanya
sekali sebelum bisa memeriksa jawabannya. Ini adalah
exercises/18/03-at-least-once.go.
continue:
lompat ke putaran berikutnya
Kalau break keluar dari perulangan sepenuhnya,
continue melewati sisa putaran saat ini dan langsung menuju
putaran berikutnya:
for i := 1; i <= 10; i++ {
if i%2 == 0 {
continue // lewati bilangan genap
}
fmt.Println(i)
}Output:
1
3
5
7
9
Pada for tiga bagian, i++ tetap berjalan
setelah continue. Pada bentuk dengan kondisi, pastikan
variabelnya sudah berubah sebelum continue, atau perulangan
tidak pernah berakhir. Hasil yang sama selalu bisa ditulis tanpa
continue, tetapi continue bisa membuat
maksudnya lebih jelas. Ini adalah
exercises/18/06-continue.go.
range pada angka
Kalau kamu hanya ingin "lakukan ini N kali", range lebih
pendek. Ia menghitung dari 0 sampai, tapi tidak termasuk,
angka itu:
for i := range 3 {
fmt.Println("Round", i)
}
for range 2 {
fmt.Println("Push-up")
}Output:
Round 0
Round 1
Round 2
Push-up
Push-up
Bentuk kedua menghilangkan variabelnya, untuk saat kamu tidak butuh
hitungannya. Bentuk ini butuh Go 1.22 atau lebih baru, yang kamu
dapatkan dari pemasangan di Bab 06. Ini adalah
exercises/18/07-range-number.go. Bab 22 memakai
range untuk menelusuri slice. Sisa bagian ini memakai
bentuk tiga bagian, karena bentuk itu bisa mulai dari mana saja dan
memakai langkah apa saja.
PR
Starter PR ada di exercises/18/homework/. Setiap starter
bisa langsung dijalankan dan mencetak satu baris pengganti.
Soal 1 — Menghitung sampai 20
Buka exercises/18/homework/01-count-to-20.go. Gunakan
for yang hanya punya kondisi untuk mencetak 1 sampai 20,
masing-masing di barisnya sendiri.
Soal 2 — Tabel perkalian 7
Buka exercises/18/homework/02-mult-table-7.go. Gunakan
for tiga bagian untuk mencetak tabel perkalian 7, dari
7 * 1 sampai 7 * 12, dalam bentuk ini:
7 * 1 = 7
7 * 2 = 14
...
7 * 12 = 84
Soal 3 — Berhenti di ambang batas
Buka exercises/18/homework/03-stop-at-threshold.go.
Lakukan perulangan dari 1, tambahkan setiap angka ke total berjalan.
Berhenti begitu total melebihi 100, lalu cetak total dan nilai
penghitung saat itu.
Tantangan — Jumlah 1..N
Buka exercises/18/homework/04-sum-1-to-n.go. Minta
bilangan bulat positif n. Hitung `1
2 + 3 + ... + n
dengan perulanganfor` dan total berjalan. Cetak:Sum from 1 to N is S
Lalu cetak rumus n * (n + 1) / 2 di baris berikutnya,
yang memberikan jawaban yang sama tanpa perulangan. Keduanya harus
cocok.
Stuck atau sudah selesai? Buka halaman solusi PR.