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:
| Operator | Nama | Contoh | Hasil |
|---|---|---|---|
== | Sama dengan | 10 == 10 | true |
!= | Tidak sama dengan | 10 != 10 | false |
< | Lebih kecil | 10 < 7 | false |
<= | Lebih kecil atau sama | 10 <= 10 | true |
> | Lebih besar | 10 > 7 | true |
>= | Lebih besar atau sama | 10 >= 10 | true |
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:
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:
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 : falseSeluruh hasil bernilai true atau false karena setiap operator perbandingan menghasilkan bool. Mari kita telaah baris demi baris program di atas:
- Baris 7-12 (
fmt.Println("10 ...")): Keenam operator perbandingan mengembalikanbool. Nilai tersebut dicetak langsung olehfmt.Printlnsebagaitrueataufalse. - 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"bernilaitrue; byte-byte sisanya tidak perlu diperiksa lagi. - 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 menjadifalse, dan"Apel"selalu dianggap “lebih kecil” daripada"apel". Perbandingan string pada Go bersifat case-sensitive. - Baris 19-21 (
x := [3]int{...}dst.): Dua array bisa dibandingkan dengan==asalkan panjangnya sama dan elemennya bertipe sebanding. Perbandingan dilakukan elemen demi elemen. - Baris 22 (
y[2] = 4): Baris ini mengubah elemen ketiga arrayy, sehingga perbandingan berikutnya menghasilkanfalse.
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:
package main
import "fmt"
func main() {
x := []int{1, 2, 3}
y := []int{1, 2, 3}
fmt.Println(x == y)
}Output yang Dihasilkan:
# 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 #
- Spesifikasi Go: Operators — tabel resmi seluruh operator termasuk operator perbandingan dan aturan comparable.
- A Tour of Go: Basics — tur resmi berisi latihan perbandingan nilai dasar.
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 berkaspackage main
import "fmt"
func main() {
x := []int{1, 2, 3}
y := []int{1, 2, 3}
fmt.Println(x == y)
}
perbandingan.go
Unduh berkaspackage 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)
}