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:

OperatorNamaContohHasil
+Penjumlahan7 + 29
-Pengurangan7 - 25
*Perkalian7 * 214
/Pembagian7 / 23
%Sisabagi (modulus)7 % 21

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:

go
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:

text
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 = NaN

Mari kita telaah baris demi baris program di atas:

  1. Baris 10 (fmt.Println("7 / 2 =", 7/2)): Kedua operand bertipe integer, sehingga hasil 3.5 dipotong menjadi 3. Pecahan 0.5 dibuang tanpa pembulatan ke atas.
  2. Baris 14 (fmt.Println("-7 / 2 =", -7/2)): Hasil -3.5 dipotong ke arah nol menjadi -3, bukan dibulatkan menjadi -4. Pemotongan ke arah nol ini disebut truncated division.
  3. Baris 15 (fmt.Println("-7 % 2 =", -7%2)): Sisa pembagian -7 / 2 adalah -1. Tanda hasil % selalu mengikuti tanda operand kiri karena -7 = (-3) * 2 + (-1).
  4. Baris 18-20 (var pembilang ... fmt.Println("7.0 / 2.0 =", pembilang/penyebut)): Ketika kedua operand bertipe float64, operator / mempertahankan pecahan dan menghasilkan 3.5. Perilaku ini berlaku untuk float32 dan float64.
  5. 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).
  6. Baris 25 (fmt.Println("0.0 / 0.0 =", nol/nol)): Nol dibagi nol pada float menghasilkan NaN (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:

go
package main

import "fmt"

func main() {
	pembagi := 0
	hasil := 7 / pembagi
	fmt.Println(hasil)
}

Output yang Dihasilkan:

text
panic: runtime error: integer divide by zero

Program 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 #

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 berkas
go
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)
}

error-pembagian-nol.go

Unduh berkas
go
package main

import "fmt"

func main() {
	pembagi := 0
	hasil := 7 / pembagi
	fmt.Println(hasil)
}