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 ):

go
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:

text
setelah ++: 101
setelah --: 100
putaran ke- 1
putaran ke- 2
putaran ke- 3
counter  : -1

Mari kita telaah baris demi baris program di atas:

  1. Baris 7-11 (pengunjung++ dan pengunjung--): 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 variable pengunjung.
  2. Baris 14 (for i := 1; i <= 3; i++): Loop for klasik terdiri dari tiga bagian: inisialisasi i := 1, kondisi i <= 3, dan post statement i++ yang dijalankan setelah setiap putaran. Posisi inilah rumah asli operator ++ di Go.
  3. Baris 15 (fmt.Println("putaran ke-", i)): Nilai i dicetak pada setiap putaran: 1, 2, lalu 3. Setelah putaran ketiga, i++ menaikkan i menjadi 4, kondisi i <= 3 bernilai false, dan loop berhenti.
  4. Baris 19-21 (counter := 0 dst.): Statement counter-- menurunkan nol menjadi -1. Bilangan negatif sah untuk tipe int karena 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:

go
package main

import "fmt"

func main() {
	x := 5
	y := x++
	fmt.Println(y)
}

Output yang Dihasilkan:

text
# command-line-arguments
./error-increment.go:7:8: syntax error: unexpected ++ at end of statement

Program 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 #

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 berkas
go
package main

import "fmt"

func main() {
	x := 5
	y := x++
	fmt.Println(y)
}

increment.go

Unduh berkas
go
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)
}