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 #
| Operator | Operasi | Contoh | Hasil |
|---|---|---|---|
+ | Penjumlahan | 7 + 2 | 9 |
- | Pengurangan | 7 - 2 | 5 |
* | Perkalian | 7 * 2 | 14 |
/ | Pembagian | 7 / 2 | 3 |
% | Sisa bagi | 7 % 2 | 1 |
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 #
| Operator | Operasi | Contoh | Hasil |
|---|---|---|---|
== | Sama dengan | "a" == "a" | true |
!= | Tidak sama dengan | 3 != 4 | true |
< <= | Kurang dari / kurang atau sama | 3 <= 3 | true |
> >= | Lebih dari / lebih atau sama | 3 > 4 | false |
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 #
| Operator | Operasi | Contoh | Hasil |
|---|---|---|---|
&& | AND logika | true && false | false |
| ` | ` | OR logika | |
! | NOT logika | !true | false |
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 #
| Operator | Operasi | Contoh | Hasil |
|---|---|---|---|
& | AND bit | 6 & 3 | 2 |
| | OR bit | 6 | 3 | 7 |
^ | XOR bit (biner) | 6 ^ 3 | 5 |
&^ | AND NOT bit (bit clear) | 5 &^ 3 | 4 |
<< | Geser kiri | 1 << 3 | 8 |
>> | Geser kanan | 16 >> 2 | 4 |
^ | 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 #
| Operator | Fungsi | Contoh |
|---|---|---|
+x | Identitas tanda | +5 |
-x | Negasi | -x |
^x | Komplemen bit | ^mask |
!x | Negasi boolean | !valid |
&x | Ambil alamat variabel | p := &x |
*p | Dereference pointer | *p = 10 |
ch <- v | Kirim nilai ke channel | ch <- 42 |
<-ch | Terima nilai dari channel | v := <-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.
| Prioritas | Operator | Kelompok |
|---|---|---|
| 5 | * / % << >> & &^ | Perkalian, geser bit, AND bit |
| 4 | + - | ^ | Penjumlahan, OR bit, XOR bit |
| 3 | == != < <= > >= | Perbandingan |
| 2 | && | AND logika |
| 1 | || | OR logika |
Operator Assignment #
| Operator | Contoh | Ekuivalen dengan |
|---|---|---|
= | x = 5 | — |
+= -= | x += 2 | x = x + 2 |
*= /= %= | x *= 2 | x = x * 2 |
&= |= ^= &^= | x &= 3 | x = x & 3 |
<<= >>= | x <<= 2 | x = 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:
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:
1<<2+3 : 7
1<<(2+3) : 32
10-4-3 : 3
2*3%4 : 2
true||false&&false : true
^2 : -3
6^3 : 5Mari kita telaah bagian-bagian penting program di atas:
- Baris 7 (
1<<2+3): geser dulu baru tambah —(1<<2)+3menghasilkan7, membuktikan prioritas<<di atas+. - Baris 10 (
1<<(2+3)): tanda kurung memaksa penjumlahan lebih dulu sehingga hasilnya1<<5yaitu32. - Baris 13-14 (
10-4-3dan2*3%4): operator setingkat dievaluasi dari kiri;(10-4)-3menghasilkan3dan(2*3)%4menghasilkan2. - Baris 17 (
true||false&&false):&&lebih dulu sehingga ekspresi setaratrue||(false&&false)yang bernilaitrue. - Baris 20-21 (
^2dan6^3):^tunggal menghasilkan komplemen-3, sedangkan^biner menghitung XOR6^3yaitu5.
Referensi #
- Spesifikasi Go — Operators — definisi resmi seluruh operator beserta operandnya.
- Spesifikasi Go — Operator precedence — tabel prioritas lima tingkat yang dikutip di atas.
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 berkaspackage 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)
}