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:

  1. Periksa count > 0. Nilainya 10, jadi benar.
  2. Cetak 10, ubah count menjadi 9.
  3. Kembali ke langkah 1. count bernilai 9, masih benar. Cetak, kurangi satu.
  4. Ulangi sampai count bernilai 0. Kondisinya gagal, perulangan keluar, dan fmt.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) // abc

score++ 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 := 1 berjalan sekali, sebelum putaran pertama.
  • i <= 5 adalah 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 + ... + ndengan 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.