Menaikkan sebuah angka tepat satu adalah operasi paling sering muncul di pemrograman: nomor putaran loop, jumlah pengunjung, atau indeks elemen yang sedang diproses. Karena itu Go menyediakan bentuk ringkas ++ untuk menaikkan dan -- untuk menurunkan. Namun Go memperlakukan keduanya dengan cara yang berbeda dari bahasa C atau Java: ++ dan -- adalah statement lengkap, bukan ekspresi yang menghasilkan nilai. Pada chapter ini kita memakai kedua operator tersebut, lalu membuktikan lewat compiler apa arti larangan “bukan ekspresi” tersebut.
++ dan – sebagai Statement #
Statement x++ setara dengan x += 1, sedangkan x-- setara dengan x -= 1. Keduanya harus berdiri sendiri di satu baris dan operand kirinya wajib berupa variable bertipe bilangan — integer maupun float. Program berikut menaikkan dan menurunkan nilai, lalu memakai i++ pada posisi yang paling idiomatik: post statement pada loop for (pernyataan pengulangannya sendiri akan kita bedah tuntas pada chapter For Loop
):
package main
import "fmt"
func main() {
// ++ menaikkan nilai satu, -- menurunkan satu
pengunjung := 100
pengunjung++
fmt.Println("setelah ++:", pengunjung)
pengunjung--
fmt.Println("setelah --:", pengunjung)
// Pemakaian idiomatik: post statement pada loop for
for i := 1; i <= 3; i++ {
fmt.Println("putaran ke-", i)
}
// Operand harus variable; 5++ akan ditolak compiler
counter := 0
counter--
fmt.Println("counter :", counter)
}Output yang Dihasilkan:
setelah ++: 101
setelah --: 100
putaran ke- 1
putaran ke- 2
putaran ke- 3
counter : -1Mari kita telaah baris demi baris program di atas:
- Baris 7-11 (
pengunjung++danpengunjung--): Nilai 100 naik menjadi 101, lalu turun kembali menjadi 100. Kedua statement ini tidak menghasilkan nilai yang bisa dipakai di tempat lain — keduanya hanya mengubah isi variablepengunjung. - Baris 14 (
for i := 1; i <= 3; i++): Loopforklasik terdiri dari tiga bagian: inisialisasii := 1, kondisii <= 3, dan post statementi++yang dijalankan setelah setiap putaran. Posisi inilah rumah asli operator++di Go. - Baris 15 (
fmt.Println("putaran ke-", i)): Nilaiidicetak pada setiap putaran: 1, 2, lalu 3. Setelah putaran ketiga,i++menaikkanimenjadi 4, kondisii <= 3bernilaifalse, dan loop berhenti. - Baris 19-21 (
counter := 0dst.): Statementcounter--menurunkan nol menjadi -1. Bilangan negatif sah untuk tipeintkarena rentangnya mencakup nilai di bawah nol.
Bukan Ekspresi: Mencoba Menyimpan Hasilnya #
Larangan menjadi ekspresi berarti x++ tidak bisa diletakkan di dalam ekspresi lain — misalnya sebagai nilai yang akan ditugaskan. Berkas error-increment.go berikut mencoba menyimpan “hasil” dari x++ ke variable y:
package main
import "fmt"
func main() {
x := 5
y := x++
fmt.Println(y)
}Output yang Dihasilkan:
# command-line-arguments
./error-increment.go:7:8: syntax error: unexpected ++ at end of statementProgram gagal dikompilasi sebelum sempat berjalan. Compiler membaca y := x sebagai statement yang sudah lengkap, lalu menemukan ++ di posisi yang tidak diharapkan, sehingga proses kompilasi berhenti di situ. Untuk mendapatkan hasil serupa dengan niat kode di atas, tuliskan dua statement terpisah: x++ terlebih dahulu, lalu y := x.
Bentuk prefix juga tidak ada di Go. Penulisan ++x dan --x ditolak compiler dengan syntax error — di dalam ekspresi pesannya syntax error: unexpected ++, expected expression, sedangkan sebagai statement tersendiri pesannya syntax error: unexpected ++, expected } — karena ++ hanya dikenal sebagai akhiran dari statement increment. Dengan dua larangan ini, pertanyaan klasik bahasa C — apakah nilai x++ yang dipakai adalah nilai lama atau nilai baru — tidak pernah muncul di Go.
Referensi #
- Spesifikasi Go: Operators
— kedudukan
++dan--di dalam daftar operator Go. - A Tour of Go: Basics
— tur resmi yang memperlihatkan pemakaian
++pada loop. - Effective Go — filosofi kesederhanaan sintaks yang melatarbelakangi desain statement.
Semua operator yang telah kita bahas bekerja pada nilai yang tersimpan di variable. Go juga menyediakan dua operator khusus yang bekerja pada lokasi nilai itu sendiri di memori. Chapter Operator Pointer
memperkenalkan operator & untuk mengambil alamat dan * untuk membaca serta menulis nilai lewat alamat tersebut.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
error-increment.go
Unduh berkaspackage main
import "fmt"
func main() {
x := 5
y := x++
fmt.Println(y)
}
increment.go
Unduh berkaspackage main
import "fmt"
func main() {
// ++ menaikkan nilai satu, -- menurunkan satu
pengunjung := 100
pengunjung++
fmt.Println("setelah ++:", pengunjung)
pengunjung--
fmt.Println("setelah --:", pengunjung)
// Pemakaian idiomatik: post statement pada loop for
for i := 1; i <= 3; i++ {
fmt.Println("putaran ke-", i)
}
// Operand harus variable; 5++ akan ditolak compiler
counter := 0
counter--
fmt.Println("counter :", counter)
}