Operator adalah tanda untuk menghitung (+ - * / %), membandingkan (== != < > <= >=), dan menggabungkan kondisi (&& || !). Bayangin Mas Bimo membagi 17 butir bakso ke 5 mangkok. Bakso gak bisa dipotong, jadi tiap mangkok dapat 3 butir dan 2 butir tersisa di panci. Pembagian angka bulat di Go bekerja persis begitu: / memberi bagian tiap mangkok, % memberi sisanya.
🧪 Tebakan cepat:
fmt.Println(17 / 5)mencetak3atau3.4? Tebak dulu, jawabannya ada di bagian "Pembagian angka bulat".
Aritmatika: + - * / %
package main
import "fmt"
func main() {
butir := 17
mangkok := 5
fmt.Println(butir / mangkok) // 3
fmt.Println(butir % mangkok) // 2
fmt.Println(10 % 3) // 1
fmt.Println(10 + 20*3) // 70
fmt.Println((10 + 20) * 3) // 90
}
$ go run bakso.go
3
2
1
70
90
butir / mangkokadalah bagian tiap mangkok: 17 dibagi 5 hasilnya 3.%disebut modulo, sisa bagi.17 % 5hasilnya 2, karena 17 = 5 × 3 + 2. Begitu juga10 % 3hasilnya 1, karena 10 = 3 × 3 + 1.*,/, dan%dihitung sebelum+dan-. Jadi10 + 20*3adalah 10 + 60 = 70. Kurung mengubah urutannya:(10 + 20) * 3= 90.
Pembagian angka bulat
Kalau dua angkanya int, hasil / juga int: pecahannya dibuang, bukan dibulatkan. Itu jawaban tebakannya: 17 / 5 mencetak 3. Arah buangnya ke nol, jadi -7 / 2 hasilnya -3.
Mau hasil desimal? Dua angkanya harus float64:
fmt.Println(17.0 / 5.0) // 3.4
fmt.Println(float64(butir) / float64(mangkok)) // 3.4
- Angka yang ditulis dengan titik, seperti
17.0, adalah desimal. Variabelintdiubah dulu denganfloat64(...), karena Go gak mencampur tipe diam-diam. %cuma untuk angka bulat.butir % mangkokdengan duafloat64ditolak:invalid operation: operator % not defined on butir (variable of type float64). Sisa bagi desimal pakaimath.Mod(butir, mangkok).
Hati-hati dengan nol. Kalau mangkok bernilai 0, butir / mangkok membuat program berhenti di baris itu dengan panic: runtime error: integer divide by zero. Baris sebelumnya sudah sempat tercetak, baris sesudahnya gak jalan. Angka nol yang ditulis langsung, 17 / 0, malah ditolak saat compile: invalid operation: division by zero. Desimal dibagi nol gak panic: 17.0 / mangkok dengan mangkok := 0.0 hasilnya +Inf.
Perbandingan dan logika
Perbandingan menghasilkan bool, true atau false:
porsi := 15
fmt.Println(porsi > 10) // true
fmt.Println(porsi == 12) // false
fmt.Println(porsi > 10 && porsi < 20) // true
fmt.Println(porsi < 5 || porsi > 12) // true
fmt.Println(!(porsi > 10)) // false
==sama dengan,!=tidak sama dengan, lalu<,>,<=,>=.&&(dan) bernilaitruekalau dua-duanya benar.||(atau) bernilaitruekalau salah satu benar.!membaliktruejadifalse.15 > 10 && 15 < 20dibaca "lebih dari 10 dan kurang dari 20", hasilnyatrue.- Yang dibandingkan harus setipe:
intdibandingkan denganfloat64ditolak denganmismatched types.
Assignment dan ++
total := 0
total += 15000 // total = total + 15000
total *= 3 // total = total * 3, jadi 45000
antrean := 1
antrean++ // antrean jadi 2
+=, -=, *=, /=, dan %= adalah singkatan "hitung lalu simpan lagi". antrean++ menambah 1, antrean-- mengurangi 1. Di Go, ++ adalah statement, perintah yang berdiri sendiri di barisnya, bukan nilai. x := antrean++ gagal dengan syntax error: unexpected ++ at end of statement, dan bentuk ++antrean gak ada sama sekali.
Go juga gak punya operator pangkat. 2 ** 3 ditolak, dan 2 ^ 3 bukan pangkat: hasilnya 1, karena ^ adalah XOR, operasi per bit. Untuk pangkat, pakai math.Pow(2, 3), hasilnya 8.
🤔 Overflow: angka yang muter balik
Tiap tipe angka bulat punya batas. int8 cuma muat -128 sampai 127. Kalau nomor antrean disimpan di int8, pelanggan sesudah nomor 127 dapat nomor -128:
var antrean int8 = 127
antrean++
fmt.Println(antrean) // -128
Angkanya muter balik ke ujung bawah tanpa error. Yang ditulis langsung lebih dari batas ditolak saat compile: var antrean int8 = 128 gagal dengan cannot use 128 (untyped int constant) as int8 value in variable declaration (overflows). int biasa di komputer 64-bit muat sampai 9.223.372.036.854.775.807, jadi untuk hitungan sehari-hari pakai int saja.
⚠️ Jebakan yang sering ketemu
- Berharap
17 / 5jadi3.4. Duainthasilnyaint. Ubah kefloat64dulu kalau butuh pecahan. - Membagi dengan variabel yang nol. Compile lolos, tapi program panic saat baris itu jalan. Cek dulu pembaginya bukan nol.
- Memakai
i++sebagai nilai. Tulisi++di barisnya sendiri, lalu pakaii. - Mengira
^itu pangkat.2 ^ 3hasilnya 1. Pangkat pakaimath.Pow.
TL;DR: + - * / menghitung, % memberi sisa bagi (17 % 5 = 2, 10 % 3 = 1), dan * / % dihitung sebelum + - (10 + 20*3 = 70). Dua int dibagi hasilnya int dengan pecahan dibuang: 17 / 5 = 3. Butuh desimal? Pakai float64: 17.0 / 5.0 = 3.4. % cuma untuk angka bulat. Bagi nol dengan variabel int bikin panic. Perbandingan menghasilkan bool; && butuh dua-duanya benar, || cukup salah satu, ! membalik. += dan teman-temannya menghitung lalu menyimpan, i++ adalah statement, bukan nilai, dan gak ada ++i atau **. int8 muter balik dari 127 ke -128.