Menu

While Loop di Golang: Cara Menulis while dan do-while di Go

Go tidak punya kata kunci while. for yang hanya berisi kondisi adalah while loop di Go, for tanpa kondisi adalah perulangan tanpa akhir, dan do-while adalah perulangan tanpa akhir dengan pemeriksaan di bagian akhir.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Go tidak punya kata kunci while. Tulis for diikuti sebuah kondisi, dan kamu sudah punya while loop:

Kondisinya diperiksa sebelum setiap iterasi, jadi kalau kondisinya false sejak awal, badan perulangan tidak pernah dijalankan. Ini sama persis dengan while (balance < 2000) di C, Java, atau JavaScript, hanya tanpa tanda kurung dan kata kuncinya. Para perancang Go memilih satu kata kunci untuk semua bentuk perulangan; lihat halaman for loop untuk keempat bentuknya.

while(true): perulangan tanpa akhir

Hilangkan kondisinya sama sekali, dan perulangan akan berjalan sampai ada sesuatu di dalamnya yang mengakhirinya:

for { } adalah cara penulisan yang idiomatis. for true { } juga bisa dikompilasi, tetapi terbaca seolah penulisnya berasal dari bahasa lain.

Ada empat hal yang mengakhiri perulangan tanpa akhir: break (keluar dari perulangan), return (keluar dari fungsi), panic, dan os.Exit. Program yang main-nya berada di for {} tanpa satu pun dari keempatnya akan berjalan sampai dihentikan paksa, dan itu memang yang tepat untuk sebuah server atau worker.

do-while

do-while menjalankan badan perulangan sekali sebelum memeriksa kondisinya. Go tidak punya sintaks khusus untuk ini. Taruh pemeriksaannya di akhir perulangan tanpa akhir:

Badan perulangan dijalankan minimal sekali apa pun yang terjadi, dan itulah ciri utama do-while. Sumber angka acaknya memakai seed tetap sehingga output-nya sama di setiap run; pakai rand.IntN tanpa sumber yang diberi seed untuk keacakan sungguhan.

Bentuk kedua menjaga kondisinya tetap di header dengan memaksa putaran pertama:

for first := true; first || condition(); first = false {
	// body
}

Cara ini bisa dipakai, tetapi perulangan tanpa akhir dengan break di akhir lebih mudah dibaca, dan itulah yang dilakukan sebagian besar kode Go.

Membaca sampai selesai

While loop yang paling umum di kode Go sungguhan adalah membaca input sampai habis. bufio.Scanner dirancang untuk itu: Scan mengembalikan false di akhir input atau saat terjadi error, jadi fungsi itulah kondisi perulangannya:

Ganti strings.NewReader(input) dengan os.Stdin, dan perulangan yang sama akan membaca input pengguna baris demi baris. Periksa scanner.Err() setelah perulangan: Scan yang mengembalikan false tidak memberi tahu apakah input berakhir normal atau gagal.

break dan continue

Keduanya bisa dipakai di semua bentuk for:

Di perulangan yang hanya berisi kondisi, continue langsung melompat ke pemeriksaan kondisi. Ini memudahkan munculnya bug yang halus: kalau penghitung diperbarui di bagian bawah badan perulangan, continue di atasnya akan melewati pembaruan itu dan perulangannya tidak pernah berakhir. Perbarui penghitung di bagian atas, seperti di atas, atau pakai for tiga klausa yang pernyataan post-nya tetap dijalankan setelah continue.

Perulangan yang menunggu sebuah kondisi sebaiknya memblokir atau tidur, bukan berputar terus:

// Wrong: burns a CPU core while waiting
for !ready {
}

// Better: poll with a delay
for !isReady() {
	time.Sleep(100 * time.Millisecond)
}

Memeriksa berulang-ulang variabel biasa yang ditulis goroutine lain juga merupakan data race. Antar-goroutine, tunggulah di channel, sync.WaitGroup, atau sync.Cond, atau pakai select dengan timer. Untuk perulangan percobaan ulang yang punya batas, lebih baik pakai for dengan penghitung agar perulangannya tidak bisa berjalan selamanya:

for attempt := 1; attempt <= 5; attempt++ {
	if err := connect(); err == nil {
		break
	}
	time.Sleep(time.Duration(attempt) * 200 * time.Millisecond)
}

Kesalahan umum

  • Lupa mengubah variabel kondisi. for i < 10 { fmt.Println(i) } tidak pernah berakhir. Setiap while loop butuh sesuatu di badannya yang menggerakkannya menuju titik keluar.
  • Menulis while. while x < 5 {} menghasilkan syntax error: unexpected name x at end of statement, karena while bukan kata kunci; compiler membacanya sebagai nama biasa.
  • Tanda kurung karena kebiasaan. for (x < 5) {} bisa dikompilasi, dan gofmt akan menghapus tanda kurungnya.
  • Mendeklarasikan variabel di dalam perulangan. for n := 10; n > 0 {} adalah syntax error; perulangan dengan klausa init butuh ketiga klausanya. Deklarasikan n sebelum perulangan, atau tulis bentuk tiga klausa yang lengkap.

Pertanyaan yang sering diajukan

Apakah Go punya while loop?

Tidak dalam bentuk kata kunci. Go memakai for untuk semua perulangan, dan for yang hanya berisi kondisi persis sama dengan while loop:

for count < 10 {
	count++
}

Kondisinya diperiksa sebelum setiap iterasi, sama seperti while (count < 10) di C atau Java.

Bagaimana cara menulis while(true) di Go?

Tulis for tanpa apa pun setelahnya: for { ... }. Perulangan ini berjalan terus sampai diakhiri oleh break, return, panic, atau os.Exit. for true { ... } juga bisa dikompilasi, tetapi for { } adalah bentuk yang idiomatis.

Bagaimana cara menulis perulangan do-while di Go?

Pakai perulangan tanpa akhir dan taruh pemeriksaan kondisinya di akhir badan perulangan:

for {
	// body runs at least once
	if !condition {
		break
	}
}

Badan perulangan selalu dijalankan sekali sebelum kondisinya diuji, dan itulah arti do-while.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai