Operator menyatkan nilai menjadi ekspresi, dan Go menyediakan set yang ringkas: aritmatika, perbandingan, logika, bitwise, penugasan, serta operator khusus pointer dan channel. Ketika beberapa operator muncul dalam satu ekspresi tanpa tanda kurung, urutan penerapannya ditentukan tabel prioritas resmi dari spesifikasi bahasa. Chapter ini merangkum seluruh operator beserta contoh hasilnya, lalu menutup dengan tabel prioritas lima tingkat yang menjadi sumber kebingungan klasik pemula. Contoh hasil pada tabel telah dihitung ulang menggunakan program di bagian akhir chapter.

Operator Aritmatika #

OperatorOperasiContohHasil
+Penjumlahan7 + 29
-Pengurangan7 - 25
*Perkalian7 * 214
/Pembagian7 / 23
%Sisa bagi7 % 21

Pembagian dua bilangan bulat menghasilkan bilangan bulat — 7 / 2 adalah 3, bukan 3.5; untuk hasil pecahan, minimal satu operand harus floating-point (7.0 / 2 menghasilkan 3.5). Operator ++ dan -- juga ada tetapi berstatus statement, bukan ekspresi: i++ sah sebagai pernyataan mandiri, sedangkan x := i++ tidak valid.

Operator Perbandingan #

OperatorOperasiContohHasil
==Sama dengan"a" == "a"true
!=Tidak sama dengan3 != 4true
< <=Kurang dari / kurang atau sama3 <= 3true
> >=Lebih dari / lebih atau sama3 > 4false

Seluruh operator perbandingan menghasilkan nilai bool. Perbandingan hanya sah untuk tipe yang dapat dibandingkan (comparable); dua struct dibandingkan field demi field, sedangkan slice dan map hanya bisa dibandingkan dengan nil.

Operator Logika #

OperatorOperasiContohHasil
&&AND logikatrue && falsefalse
``OR logika
!NOT logika!truefalse

Operator && dan || mengevaluasi secara short-circuit: operand kanan tidak dievaluasi bila operand kiri sudah memutuskan hasilnya. Perilaku ini kerap dipakai untuk melindungi akses, misalnya ptr != nil && *ptr > 0.

Operator Bitwise #

OperatorOperasiContohHasil
&AND bit6 & 32
|OR bit6 | 37
^XOR bit (biner)6 ^ 35
&^AND NOT bit (bit clear)5 &^ 34
<<Geser kiri1 << 38
>>Geser kanan16 >> 24
^Komplemen bit (tunggal)^2-3

Operator ^ memainkan dua peran: sebagai operator biner ia menghitung XOR, sedangkan sebagai operator tunggal di depan satu operand ia membalik seluruh bit (komplemen dua). Operator &^ membersihkan bit yang ditandai operand kanan — 5 &^ 3 menghasilkan 4 karena bit ke-0 dan ke-1 dihapus dari 5.

Operator Unary dan Channel #

OperatorFungsiContoh
+xIdentitas tanda+5
-xNegasi-x
^xKomplemen bit^mask
!xNegasi boolean!valid
&xAmbil alamat variabelp := &x
*pDereference pointer*p = 10
ch <- vKirim nilai ke channelch <- 42
<-chTerima nilai dari channelv := <-ch

Tabel Prioritas Operator #

Spesifikasi Go mendefinisikan lima tingkat prioritas untuk operator biner. Semakin tinggi angkanya, semakin kuat operator tersebut mengikat operandnya. Operator tunggal (unary) selalu memiliki prioritas tertinggi di atas kelima tingkat ini.

PrioritasOperatorKelompok
5* / % << >> & &^Perkalian, geser bit, AND bit
4+ - | ^Penjumlahan, OR bit, XOR bit
3== != < <= > >=Perbandingan
2&&AND logika
1||OR logika

Operator Assignment #

OperatorContohEkuivalen dengan
=x = 5—
+= -=x += 2x = x + 2
*= /= %=x *= 2x = x * 2
&= |= ^= &^=x &= 3x = x & 3
<<= >>=x <<= 2x = x << 2

Menguji Prioritas dengan Program #

Berkas prioritas-demo.go menjalankan ekspresi-ekspresi jebakan di atas dan mencetak hasil aslinya, termasuk pembuktian bahwa operator setingkat dievaluasi dari kiri ke kanan:

go
package main

import "fmt"

func main() {
	// << (prioritas 5) lebih tinggi daripada + (prioritas 4).
	fmt.Println("1<<2+3   :", 1<<2+3)

	// Kurung mengubah pengelompokan evaluasi secara eksplisit.
	fmt.Println("1<<(2+3) :", 1<<(2+3))

	// Operator berprioritas sama dievaluasi dari kiri ke kanan.
	fmt.Println("10-4-3   :", 10-4-3)
	fmt.Println("2*3%4    :", 2*3%4)

	// && (prioritas 2) lebih tinggi daripada || (prioritas 1).
	fmt.Println("true||false&&false :", true || false && false)

	// ^ biner adalah XOR; ^ tunggal melengkapi bit (two's complement).
	fmt.Println("^2       :", ^2)
	fmt.Println("6^3      :", 6^3)
}

Output yang Dihasilkan:

text
1<<2+3   : 7
1<<(2+3) : 32
10-4-3   : 3
2*3%4    : 2
true||false&&false : true
^2       : -3
6^3      : 5

Mari kita telaah bagian-bagian penting program di atas:

  1. Baris 7 (1<<2+3): geser dulu baru tambah — (1<<2)+3 menghasilkan 7, membuktikan prioritas << di atas +.
  2. Baris 10 (1<<(2+3)): tanda kurung memaksa penjumlahan lebih dulu sehingga hasilnya 1<<5 yaitu 32.
  3. Baris 13-14 (10-4-3 dan 2*3%4): operator setingkat dievaluasi dari kiri; (10-4)-3 menghasilkan 3 dan (2*3)%4 menghasilkan 2.
  4. Baris 17 (true||false&&false): && lebih dulu sehingga ekspresi setara true||(false&&false) yang bernilai true.
  5. Baris 20-21 (^2 dan 6^3): ^ tunggal menghasilkan komplemen -3, sedangkan ^ biner menghitung XOR 6^3 yaitu 5.

Referensi #

Operator bekerja pada nilai; untuk mengubah nilai di dalam program kita membutuhkan fungsi bawaan seperti make dan append — seluruh daftarnya dirangkum pada chapter Built-in Function .

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

prioritas-demo.go

Unduh berkas
go
package main

import "fmt"

func main() {
	// << (prioritas 5) lebih tinggi daripada + (prioritas 4).
	fmt.Println("1<<2+3   :", 1<<2+3)

	// Kurung mengubah pengelompokan evaluasi secara eksplisit.
	fmt.Println("1<<(2+3) :", 1<<(2+3))

	// Operator berprioritas sama dievaluasi dari kiri ke kanan.
	fmt.Println("10-4-3   :", 10-4-3)
	fmt.Println("2*3%4    :", 2*3%4)

	// && (prioritas 2) lebih tinggi daripada || (prioritas 1).
	fmt.Println("true||false&&false :", true || false && false)

	// ^ biner adalah XOR; ^ tunggal melengkapi bit (two's complement).
	fmt.Println("^2       :", ^2)
	fmt.Println("6^3      :", 6^3)
}