Odin memuat seluruh perangkat alur kendali dengan sedikit kata kunci: if untuk percabangan bersyarat, for untuk perulangan, dan switch untuk pemilihan banyak kasus, dengan blok kurung kurawal dan kata kunci do sebagai dua bentuk penulisan isi if dan for. Topik ini membahas perangkat-perangkat tersebut secara berurutan, dari percabangan sederhana sampai perulangan atas koleksi, lalu ditutup dengan kesalahan umum yang muncul saat perangkat ini dipraktikkan. Setiap contoh berupa program utuh yang dikompilasi dan dijalankan dengan Odin dev-2026-10, sehingga setiap keluaran yang ditampilkan berasal dari eksekusi nyata.
Percabangan dengan if#
Pernyataan if menjalankan blok pernyataan apabila kondisinya bernilai benar. Kondisi ditulis tanpa tanda kurung di sekitarnya, berbeda dari C yang menuntutnya, tetapi kurung kurawal wajib ada sehingga batas setiap cabang tidak pernah ambigu. Tipe kondisi wajib bool, dan angka bukan nol tidak ditafsirkan sebagai benar, sehingga pengujian harus dinyatakan eksplisit seperti if x != 0.
Cabang alternatif ditambahkan dengan else if, sedangkan else penutup bersifat opsional. Proc kategori pada program berikut mengubah nilai ujian menjadi huruf predikat. Syaratnya diurutkan dari rentang tertinggi karena if berhenti pada kondisi pertama yang terpenuhi, sehingga urutan pemeriksaan ikut menentukan hasilnya.
package main
import "core:fmt"
// kategori mengubah nilai ujian 0 sampai 100 menjadi huruf predikat
kategori :: proc(nilai: int) -> string {
if nilai >= 85 {
return "A"
} else if nilai >= 75 {
return "B"
} else if nilai >= 60 {
return "C"
}
return "D"
}
main :: proc() {
// if dengan pernyataan awal: nilai hanya hidup di dalam percabangan ini
if nilai := 72; nilai >= 60 {
fmt.printfln("Nilai %d lulus dengan predikat %s", nilai, kategori(nilai))
} else {
fmt.printfln("Nilai %d belum lulus", nilai)
}
// rangkaian else if diuji dari syarat tertinggi ke terendah
fmt.printfln("Nilai %d predikatnya %s", 91, kategori(91))
fmt.printfln("Nilai %d predikatnya %s", 77, kategori(77))
fmt.printfln("Nilai %d predikatnya %s", 45, kategori(45))
}# kompilasi dan jalankan program utuh dari folder topik
odin run main.odin -fileNilai 72 lulus dengan predikat C
Nilai 91 predikatnya A
Nilai 77 predikatnya B
Nilai 45 predikatnya DBentuk if yang lebih ringkas membawa pernyataan awal (initial statement) sebelum kondisinya, dipisahkan dengan titik koma. Pada program di atas, if nilai := 72; nilai >= 60 mendeklarasikan nilai khusus untuk percabangan tersebut, dan variabel yang sama tetap dapat dibaca di dalam cabang else. Lingkup variabelnya berakhir pada kurung kurawal penutup, sehingga nama sementara seperti ini tidak bertahan lebih lama dari kegunaannya.
Perulangan dengan for#
Odin memiliki tepat satu kata kunci perulangan, yaitu for, dengan empat bentuk pemakaian. Bentuk klasik memuat tiga komponen yang dipisahkan titik koma, yaitu pernyataan awal yang dijalankan sekali sebelum putaran pertama, kondisi yang diuji sebelum setiap putaran, dan pernyataan yang dijalankan pada akhir setiap putaran. Sama seperti if, ketiga komponen itu ditulis tanpa tanda kurung. Bentuk kedua menyisakan kondisi saja sehingga perilakunya setara dengan while pada bahasa lain, sedangkan bentuk tanpa kondisi apa pun berjalan tanpa henti.
Bentuk ketiga menelusuri rentang angka. Penulisan for i in 0 ..< 5 berjalan dari 0 sampai sebelum 5 karena operator ..< menandai rentang terbuka yang tidak menyertakan batas atas, sedangkan operator ..= menyertakan batas atas sehingga 1 ..= 5 menelusuri lima nilai. Bentuk keempat mengiterasi koleksi seperti slice: satu variabel mengambil nilai setiap elemen, dan dua variabel mengambil nilai beserta indeksnya sekaligus.
package main
import "core:fmt"
main :: proc() {
// for klasik: pernyataan awal, kondisi, dan pernyataan akhir putaran
for i := 1; i <= 5; i += 1 {
fmt.printf("%d ", i)
}
fmt.println()
// for bersyarat: hanya kondisi, perilakunya setara while
sisa := 16
for sisa >= 4 {
sisa -= 4
}
fmt.printfln("sisa = %d", sisa)
// for rentang terbuka: 0 sampai sebelum 5
for i in 0 ..< 5 {
fmt.printf("%d ", i)
}
fmt.println()
// for rentang tertutup bersarang: tabel perkalian 1 sampai 5
for baris in 1 ..= 5 {
for kolom in 1 ..= 5 {
fmt.printf("%d ", baris * kolom)
}
fmt.println()
}
// for koleksi: nilai dan indeks sekaligus
nilai_ujian := []int{85, 72, 91, 66}
total := 0
for v, idx in nilai_ujian {
total += v
fmt.printfln("ujian ke-%d: %d", idx + 1, v)
}
fmt.printfln("total nilai = %d", total)
}# kompilasi dan jalankan program perulangan
odin run perulangan.odin -file1 2 3 4 5
sisa = 0
0 1 2 3 4
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
ujian ke-1: 85
ujian ke-2: 72
ujian ke-3: 91
ujian ke-4: 66
total nilai = 314Pada keluaran di atas, bentuk bersyarat mengurangi sisa sebesar empat pada setiap putaran hingga nilainya kurang dari empat. Tabel perkalian satu sampai lima dihasilkan oleh dua perulangan rentang yang bersarang, dan perulangan koleksi menjumlahkan seluruh elemen nilai_ujian sambil mencatat posisi setiap elemen. Total 314 itu dihitung langsung dari data, sehingga mengubah satu angka pada slice akan mengubah keluarannya.
Pemilihan dengan switch#
Pernyataan switch membandingkan satu nilai dengan deretan kasus dari atas ke bawah, lalu menjalankan kasus pertama yang cocok. Hanya kasus terpilih yang dieksekusi, dan eksekusi tidak diteruskan ke kasus berikutnya sebagaimana terjadi pada C, sehingga break tidak diperlukan di akhir setiap cabang. Apabila perilaku tersebut memang dikehendaki, kata kunci fallthrough dapat digunakan untuk menirunya. Satu kasus boleh memuat beberapa nilai sekaligus, misalnya case "B", "C":, dan kasus tanpa ekspresi yang ditulis case: berperan sebagai kasus bawaan (default).
Nilai kasus juga boleh berupa rentang, sehingga pemetaan nilai ujian menjadi predikat dapat ditulis tanpa rangkaian else if yang panjang. Seperti if, pernyataan switch dapat membawa pernyataan awal untuk mendeklarasikan variabel yang hanya hidup di dalamnya. Program berikut memakai kasus bawaan pada pemilihan string dan kasus rentang pada pemilihan angka.
package main
import "core:fmt"
main :: proc() {
// kasus berganda dan kasus bawaan case:
predikat := "B"
switch predikat {
case "A":
fmt.println("Pertahankan")
case "B", "C":
fmt.println("Stabil, perlu penguatan")
case:
fmt.println("Perlu pendampingan")
}
// switch dengan pernyataan awal dan kasus rentang
switch nilai := 77; nilai {
case 85 ..= 100:
fmt.println("predikat A")
case 75 ..< 85:
fmt.println("predikat B")
case 60 ..< 75:
fmt.println("predikat C")
case 0 ..< 60:
fmt.println("predikat D")
}
}# kompilasi dan jalankan program pemilihan kasus
odin run predikat.odin -fileStabil, perlu penguatan
predikat BApabila nilai yang diperiksa bertipe enum, seluruh variannya wajib dijawab oleh kasus yang ada, dan kegagalan menjawab salah satunya terdeteksi saat kompilasi. Varian yang sengaja diabaikan dapat ditandai dengan #partial switch, yaitu bentuk switch yang tidak menuntut kelengkapan kasus. Untuk percabangan yang kondisinya dinilai saat kompilasi, Odin menyediakan pernyataan when, yang pembahasannya berada pada modul Polimorfisme parametrik.
Blok kurung kurawal dan bentuk do#
Sekelompok pernyataan yang dibingkai kurung kurawal membentuk blok, dan setiap blok menciptakan lingkup (scope) sendiri: nama yang dideklarasikan di dalamnya hanya dikenal sampai kurung kurawal penutup. Deklarasi pada pernyataan awal if serta penghitung for pada bagian sebelumnya menggunakan mekanisme yang sama, sehingga keduanya tidak bocor ke lingkup luarnya. Blok juga boleh ditulis berdiri sendiri di dalam badan proc untuk membatasi masa hidup variabel sementara.
Karena blok adalah lingkup, pernyataan defer yang ditulis di dalamnya dieksekusi tepat sebelum kurung kurawal penutup blok, bukan pada akhir proc. Perilaku itu berguna untuk memasangkan persiapan dengan pembersihannya di dalam wilayah yang lebih kecil dari badan proc. Program berikut menunjukkan urutan eksekusinya secara langsung.
package main
import "core:fmt"
main :: proc() {
// blok kurawal membentuk lingkup sendiri
{
defer fmt.println("lingkup blok berakhir")
fmt.println("pekerjaan di dalam blok")
}
fmt.println("eksekusi berlanjut di luar blok")
// bentuk do: satu pernyataan tanpa kurawal
selisih := 12
if selisih % 2 == 0 do fmt.println("selisih genap")
for i := 1; i <= 3; i += 1 do fmt.printf("%d ", i)
fmt.println()
}# kompilasi dan jalankan program blok dan do
odin run blok-do.odin -filepekerjaan di dalam blok
lingkup blok berakhir
eksekusi berlanjut di luar blok
selisih genap
1 2 3 Keluaran memperlihatkan bahwa pesan akhir blok muncul sebelum eksekusi berlanjut ke pernyataan di luarnya. Untuk isi yang hanya berupa satu pernyataan, kurung kurawal dapat digantikan dengan kata kunci do sebagaimana digunakan pada dua pernyataan terakhir program di atas. Kurung kurawal atau do wajib dipilih salah satu, karena if dan for tidak mengizinkan pernyataan tunggal yang ditulis tanpa keduanya.
Kesalahan umum#
Kesalahan pertama adalah meletakkan nilai bukan bool sebagai kondisi, misalnya if jumlah { } untuk menguji apakah jumlah bukan nol. Compiler menolaknya dengan pesan Non-boolean condition in 'if' statement karena tidak ada konversi angka ke nilai kebenaran. Perbaikannya adalah menuliskan perbandingan secara eksplisit, yaitu if jumlah != 0 { }.
Kesalahan kedua adalah tertukarnya operator rentang. Tabel perkalian satu sampai lima yang ditulis for baris in 1 ..< 5 hanya menghasilkan empat baris karena batas atas tidak disertakan. Operator ..< digunakan ketika batas atas memang harus dikeluarkan, sedangkan ..= digunakan ketika batas tersebut bagian dari rentang.
Kesalahan ketiga terjadi pada switch yang memeriksa nilai enum tanpa menjawab seluruh variannya. Menyertakan case: tidak menjawab varian yang hilang pada Odin dev-2026-10, sehingga compiler tetap melaporkan Unhandled switch cases dan menyarankan #partial switch. Perbaikannya adalah menjawab seluruh varian atau menandai pernyataan sebagai parsial apabila varian yang tersisa memang tidak relevan.
Ringkasan#
- Pernyataan
ifditulis tanpa tanda kurung dengan kondisi wajibbool, dan dapat membawa pernyataan awal yang lingkupnya terbatas pada percabangan tersebut. foradalah satu-satunya kata kunci perulangan, dengan bentuk klasik tiga komponen, bentuk bersyarat, rentang..<dan..=, serta iterasi koleksi yang menghasilkan pasangan nilai dan indeks.switchmenjalankan tepat satu kasus, menerima kasus berganda dan kasus rentang, dengancase:sebagai kasus bawaan, dan menerima#partial switchuntuk varianenumyang tidak dijawab.- Kurung kurawal membentuk blok dengan lingkup sendiri, sedangkan
domenggantikan kurung kurawal untuk isi berupa satu pernyataan.
Referensi#
- An Overview of Odin — Odin Language — Bagian control flow menjelaskan pernyataan if, for, switch, when, defer, serta #partial switch yang menjadi dasar topik ini.
- Package fmt — Odin Language — Dokumentasi fmt.println, fmt.printf, dan fmt.printfln yang digunakan pada seluruh contoh program.