Program komputer mengambil keputusan dengan membandingkan nilai: apakah stok sudah habis, apakah kata sandi cocok, atau apakah dua daftar berisi data yang sama. Go menyediakan enam operator perbandingan yang semuanya menghasilkan nilai bertipe bool — hanya true atau false. Nilai bool inilah yang nantinya menjadi bahan bakar pernyataan if dan loop. Pada chapter ini kita akan mencoba keenam operator pada angka, membongkar cara Go membandingkan string byte demi byte, lalu menguji batas penting: tipe mana yang bisa dibandingkan dengan == dan tipe mana yang tidak.

Daftar Operator Perbandingan #

Tabel berikut merangkum enam operator perbandingan pada Go:

OperatorNamaContohHasil
==Sama dengan10 == 10true
!=Tidak sama dengan10 != 10false
<Lebih kecil10 < 7false
<=Lebih kecil atau sama10 <= 10true
>Lebih besar10 > 7true
>=Lebih besar atau sama10 >= 10true

Kedua operand harus bertipe sebanding: ekspresi 10 == "10" ditolak compiler karena bilangan bulat tidak bisa dibandingkan dengan string. Perbandingan antar tipe berbeda seperti int dan int64 juga ditolak kecuali salah satu operand berupa konstanta tak bertipe yang nilainya muat pada tipe lawannya.

Membandingkan Angka dan String #

Operator perbandingan bekerja pada semua tipe dasar yang bisa diurutkan: bilangan bulat, bilangan pecahan, dan string. Program berikut mencoba keenam operator pada angka, lalu membandingkan dua string:

go
package main

import "fmt"

func main() {
	// Semua operator perbandingan menghasilkan nilai bool
	fmt.Println("10 > 7  :", 10 > 7)
	fmt.Println("10 < 7  :", 10 < 7)
	fmt.Println("10 >= 10:", 10 >= 10)
	fmt.Println("10 <= 9 :", 10 <= 9)
	fmt.Println("10 == 10:", 10 == 10)
	fmt.Println("10 != 10:", 10 != 10)

	// String dibandingkan byte demi byte (lexicographic)
	fmt.Println("\"apel\" < \"bola\" :", "apel" < "bola")
	fmt.Println("\"apel\" < \"Apel\":", "apel" < "Apel")

	// Array dibandingkan elemen demi elemen
	x := [3]int{1, 2, 3}
	y := [3]int{1, 2, 3}
	fmt.Println("x == y :", x == y)
	y[2] = 4
	fmt.Println("x == y :", x == y)
}

Output yang Dihasilkan:

text
10 > 7  : true
10 < 7  : false
10 >= 10: true
10 <= 9 : false
10 == 10: true
10 != 10: false
"apel" < "bola" : true
"apel" < "Apel": false
x == y : true
x == y : false

Seluruh hasil bernilai true atau false karena setiap operator perbandingan menghasilkan bool. Mari kita telaah baris demi baris program di atas:

  1. Baris 7-12 (fmt.Println("10 ...")): Keenam operator perbandingan mengembalikan bool. Nilai tersebut dicetak langsung oleh fmt.Println sebagai true atau false.
  2. Baris 15 (fmt.Println("\"apel\" < \"bola\" :", "apel" < "bola")): Perbandingan string bersifat lexicographic: Go membandingkan byte pertama kedua string, lalu byte kedua, dan seterusnya sampai ditemukan perbedaan. Byte 'a' (97) lebih kecil dari 'b' (98), sehingga "apel" < "bola" bernilai true; byte-byte sisanya tidak perlu diperiksa lagi.
  3. Baris 16 (fmt.Println("\"apel\" < \"Apel\":", "apel" < "Apel")): Huruf kapital 'A' bernilai byte 65, lebih kecil dari huruf kecil 'a' yang bernilai 97. Hasil perbandingan menjadi false, dan "Apel" selalu dianggap “lebih kecil” daripada "apel". Perbandingan string pada Go bersifat case-sensitive.
  4. Baris 19-21 (x := [3]int{...} dst.): Dua array bisa dibandingkan dengan == asalkan panjangnya sama dan elemennya bertipe sebanding. Perbandingan dilakukan elemen demi elemen.
  5. Baris 22 (y[2] = 4): Baris ini mengubah elemen ketiga array y, sehingga perbandingan berikutnya menghasilkan false.

Array Bisa, Slice Tidak #

Aturan perbandingan == mengikuti definisi comparable pada spesifikasi Go. Bilangan, string, pointer, channel, dan array yang elemennya comparable semuanya boleh dibandingkan. Sebaliknya, slice, map, dan function tidak bisa dibandingkan nilainya dengan == karena ketiganya berisi referensi ke struktur internal yang ukurannya tidak tetap. Berkas error-perbandingan-slice.go berikut membuktikan batas tersebut:

go
package main

import "fmt"

func main() {
	x := []int{1, 2, 3}
	y := []int{1, 2, 3}
	fmt.Println(x == y)
}

Output yang Dihasilkan:

text
# command-line-arguments
./error-perbandingan-slice.go:8:14: invalid operation: x == y (slice can only be compared to nil)

Program di atas gagal dikompilasi, bukan gagal saat berjalan. Compiler Go menolak ekspresi x == y karena slice hanya boleh dibandingkan dengan nil. Pesan yang sama berlaku untuk map (map can only be compared to nil) dan function (func can only be compared to nil). Untuk menguji kesamaan isi dua slice atau map, gunakan fungsi slices.Equal dari package slices, atau bandingkan elemen satu per satu dengan loop.

Referensi #

Nilai true dan false dari operator perbandingan menjadi jauh lebih berguna ketika digabungkan: “stok ada DAN pembeli sah”. Chapter Operator Logika akan menunjukkan cara menggabungkan beberapa kondisi dan bagaimana Go menghemat kerja lewat short-circuit evaluation.

Berkas Sumber

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

error-perbandingan-slice.go

Unduh berkas
go
package main

import "fmt"

func main() {
	x := []int{1, 2, 3}
	y := []int{1, 2, 3}
	fmt.Println(x == y)
}

perbandingan.go

Unduh berkas
go
package main

import "fmt"

func main() {
	// Semua operator perbandingan menghasilkan nilai bool
	fmt.Println("10 > 7  :", 10 > 7)
	fmt.Println("10 < 7  :", 10 < 7)
	fmt.Println("10 >= 10:", 10 >= 10)
	fmt.Println("10 <= 9 :", 10 <= 9)
	fmt.Println("10 == 10:", 10 == 10)
	fmt.Println("10 != 10:", 10 != 10)

	// String dibandingkan byte demi byte (lexicographic)
	fmt.Println("\"apel\" < \"bola\" :", "apel" < "bola")
	fmt.Println("\"apel\" < \"Apel\":", "apel" < "Apel")

	// Array dibandingkan elemen demi elemen
	x := [3]int{1, 2, 3}
	y := [3]int{1, 2, 3}
	fmt.Println("x == y :", x == y)
	y[2] = 4
	fmt.Println("x == y :", x == y)
}