Hampir setiap program perlu menghitung sesuatu: total harga belanja, sisa stok, atau jumlah baris pada sebuah berkas. Go menyediakan lima operator aritmatika biner yang bekerja pada bilangan bulat maupun pecahan. Di balik bentuknya yang familiar, kelima operator tersebut menyimpan aturan penting yang sering menjebak pemula: pembagian bilangan bulat memotong pecahan, operator sisabagi hanya berlaku untuk bilangan bulat, dan pembagian dengan nol berperilaku sangat berbeda pada kedua jenis bilangan. Pada chapter ini kita mencoba setiap operator melalui satu program utuh, lalu menyaksikan sendiri apa yang terjadi ketika sebuah program membagi bilangan bulat dengan nol.
Daftar Operator Aritmatika #
Tabel berikut merangkum lima operator aritmatika biner pada Go:
| Operator | Nama | Contoh | Hasil |
|---|---|---|---|
+ | Penjumlahan | 7 + 2 | 9 |
- | Pengurangan | 7 - 2 | 5 |
* | Perkalian | 7 * 2 | 14 |
/ | Pembagian | 7 / 2 | 3 |
% | Sisabagi (modulus) | 7 % 2 | 1 |
Di luar lima operator biner tersebut, Go juga mengenal bentuk unary. Operator - tunggal membalik tanda sebuah bilangan (-saldo), sedangkan operator + tunggal tidak mengubah apa pun dan jarang dipakai. Berbeda dengan banyak bahasa lain, Go tidak memiliki operator pemangkatan seperti ** atau pow; pemangkatan dilakukan dengan memanggil fungsi math.Pow dari standard library.
Pembagian Integer Memotong Pecahan #
Aturan yang paling sering mengejutkan pemula adalah perilaku operator / pada dua bilangan bulat. Ketika kedua operand bertipe integer, Go memotong hasil ke arah nol, sehingga pecahan dibuang sama sekali. Operator % mengembalikan sisa pembagian dan mengikuti aturan pemotongan yang sama, sehingga tanda hasil sisabagi mengikuti tanda bilangan yang dibagi. Program berikut memperlihatkan seluruh operator dalam aksi:
package main
import "fmt"
func main() {
// Operator aritmatika pada dua bilangan bulat
fmt.Println("7 + 2 =", 7+2)
fmt.Println("7 - 2 =", 7-2)
fmt.Println("7 * 2 =", 7*2)
fmt.Println("7 / 2 =", 7/2)
fmt.Println("7 % 2 =", 7%2)
// Pembagian bulat terpotong ke arah nol
fmt.Println("-7 / 2 =", -7/2)
fmt.Println("-7 % 2 =", -7%2)
// Pembagian pada float mempertahankan pecahan
var pembilang float64 = 7
var penyebut float64 = 2
fmt.Println("7.0 / 2.0 =", pembilang/penyebut)
// Pembagian float dengan nol tidak panic
var nol float64 = 0
fmt.Println("1.0 / 0.0 =", 1.0/nol)
fmt.Println("0.0 / 0.0 =", nol/nol)
}Output yang Dihasilkan:
7 + 2 = 9
7 - 2 = 5
7 * 2 = 14
7 / 2 = 3
7 % 2 = 1
-7 / 2 = -3
-7 % 2 = -1
7.0 / 2.0 = 3.5
1.0 / 0.0 = +Inf
0.0 / 0.0 = NaNMari kita telaah baris demi baris program di atas:
- Baris 10 (
fmt.Println("7 / 2 =", 7/2)): Kedua operand bertipe integer, sehingga hasil3.5dipotong menjadi3. Pecahan0.5dibuang tanpa pembulatan ke atas. - Baris 14 (
fmt.Println("-7 / 2 =", -7/2)): Hasil-3.5dipotong ke arah nol menjadi-3, bukan dibulatkan menjadi-4. Pemotongan ke arah nol ini disebut truncated division. - Baris 15 (
fmt.Println("-7 % 2 =", -7%2)): Sisa pembagian-7 / 2adalah-1. Tanda hasil%selalu mengikuti tanda operand kiri karena-7 = (-3) * 2 + (-1). - Baris 18-20 (
var pembilang ... fmt.Println("7.0 / 2.0 =", pembilang/penyebut)): Ketika kedua operand bertipefloat64, operator/mempertahankan pecahan dan menghasilkan3.5. Perilaku ini berlaku untukfloat32danfloat64. - Baris 24 (
fmt.Println("1.0 / 0.0 =", 1.0/nol)): Pembagian float dengan nol tidak menghentikan program. Standar IEEE 754 mendefinisikan hasilnya sebagai+Inf(tak hingga positif). - Baris 25 (
fmt.Println("0.0 / 0.0 =", nol/nol)): Nol dibagi nol pada float menghasilkanNaN(not a number), nilai khusus yang menandakan hasil tak terdefinisi.
Pembagian dengan Nol pada Integer #
Berbeda dengan float, pembagian bilangan bulat dengan nol tidak memiliki nilai hasil yang masuk akal, sehingga Go memilih menghentikan program. Runtime menghentikan eksekusi melalui mekanisme panic. Berkas error-pembagian-nol.go berikut sengaja memuat operasi tersebut:
package main
import "fmt"
func main() {
pembagi := 0
hasil := 7 / pembagi
fmt.Println(hasil)
}Output yang Dihasilkan:
panic: runtime error: integer divide by zeroProgram panic pada baris hasil := 7 / pembagi sebelum sempat mencetak apa pun. Setelah baris panic: tersebut, Go juga mencetak goroutine stack trace yang menunjukkan berkas dan baris penyebab; isi trace ini memuat path berkas serta alamat memori yang berbeda-beda di setiap komputer, sehingga tidak kami salin utuh. Perintah go run kemudian melaporkan exit status 2, dan program berhenti total. Mekanisme panic dan cara menanganinya akan kita bahas tuntas pada Section Error Handling
.
Referensi #
- Spesifikasi Go: Arithmetic operators — aturan resmi seluruh operator aritmatika termasuk pembagian dengan nol.
- Spesifikasi Go: Integer overflow — perilaku operasi aritmatika bilangan bulat yang meluap (overflow).
- A Tour of Go: Basics — tur resmi yang memperkenalkan operasi aritmatika dasar.
Setelah mampu menghitung nilai, langkah alami berikutnya adalah membandingkan dua nilai untuk mengambil keputusan. Chapter Operator Perbandingan akan membahas cara Go menilai apakah sebuah nilai lebih besar, sama, atau tidak sama dengan nilai lain.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
aritmatika.go
Unduh berkaspackage main
import "fmt"
func main() {
// Operator aritmatika pada dua bilangan bulat
fmt.Println("7 + 2 =", 7+2)
fmt.Println("7 - 2 =", 7-2)
fmt.Println("7 * 2 =", 7*2)
fmt.Println("7 / 2 =", 7/2)
fmt.Println("7 % 2 =", 7%2)
// Pembagian bulat terpotong ke arah nol
fmt.Println("-7 / 2 =", -7/2)
fmt.Println("-7 % 2 =", -7%2)
// Pembagian pada float mempertahankan pecahan
var pembilang float64 = 7
var penyebut float64 = 2
fmt.Println("7.0 / 2.0 =", pembilang/penyebut)
// Pembagian float dengan nol tidak panic
var nol float64 = 0
fmt.Println("1.0 / 0.0 =", 1.0/nol)
fmt.Println("0.0 / 0.0 =", nol/nol)
}
error-pembagian-nol.go
Unduh berkaspackage main
import "fmt"
func main() {
pembagi := 0
hasil := 7 / pembagi
fmt.Println(hasil)
}