Operator Go — Go

Operator Go Operator Aritmatika a + b // Penjumlahan a - b // Pengurangan a * b // Perkalian a / b // Pembagian (integer jika kedua operand int) a % b //…

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) mencetak 3 atau 3.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

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

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

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

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.

Yang akan kamu pelajari