Menyimpan nilai ke dalam variable adalah operasi yang paling sering dilakukan program: menghitung total belanja, mengubah skor pemain, atau memperbarui sisa stok. Go menyediakan operator assignment = untuk penugasan biasa dan serangkaian bentuk gabungan seperti += yang memadukan operasi hitung dengan penugasan dalam satu langkah. Bentuk gabungan ini membuat kode lebih pendek dan mengurangi pengulangan nama variable yang panjang. Pada chapter ini kita mencoba semua operator gabungan, memakainya pada elemen map, lalu mempelajari multiple assignment yang mampu menukar dua nilai tanpa variable perantara.
Operator = dan Bentuk Gabungannya #
Operator assignment dasar = mengevaluasi ekspresi di sisi kanan, lalu menyimpan hasilnya ke variable di sisi kiri. Setiap operator aritmatika dan bitwise biner mempunyai bentuk gabungan yang setara, sebagaimana dirangkum tabel berikut:
| Bentuk gabungan | Setara dengan |
|---|---|
x += 5 | x = x + 5 |
x -= 5 | x = x - 5 |
x *= 5 | x = x * 5 |
x /= 5 | x = x / 5 |
x %= 5 | x = x % 5 |
x &= 5 | x = x & 5 |
x |= 5 | x = x | 5 |
x ^= 5 | x = x ^ 5 |
x &^= 5 | x = x &^ 5 |
x <<= 2 | x = x << 2 |
x >>= 2 | x = x >> 2 |
Program berikut memakai hampir seluruh operator gabungan pada skenario kecil: saldo rekening, jumlah stok, dan hak akses berbentuk bit mask:
package main
import "fmt"
func main() {
// Operator gabungan pada variable angka
saldo := 1000
saldo += 500
fmt.Println("setelah setoran :", saldo)
saldo -= 200
fmt.Println("setelah tarikan :", saldo)
stok := 30
stok *= 3
fmt.Println("setelah kalikan :", stok)
stok /= 4
fmt.Println("setelah bagi :", stok)
stok %= 5
fmt.Println("sisa bagi :", stok)
// Operator bitwise juga punya bentuk gabungan
izin := 0b0101
izin |= 0b0010
fmt.Printf("izin |= 0010 : %04b\n", izin)
izin &^= 0b0001
fmt.Printf("izin &^= 0001 : %04b\n", izin)
// Operator gabungan pada elemen map
skor := map[string]int{"Budi": 70}
skor["Budi"] += 25
skor["Siti"] += 10 // kunci baru mulai dari zero value 0
fmt.Println("skor Budi:", skor["Budi"])
fmt.Println("skor Siti:", skor["Siti"])
// Multiple assignment menukar dua nilai tanpa variable sementara
x, y := 1, 2
x, y = y, x
fmt.Println("x =", x, ", y =", y)
}Output yang Dihasilkan:
setelah setoran : 1500
setelah tarikan : 1300
setelah kalikan : 90
setelah bagi : 22
sisa bagi : 2
izin |= 0010 : 0111
izin &^= 0001 : 0110
skor Budi: 95
skor Siti: 10
x = 2 , y = 1Mari kita telaah baris demi baris program di atas:
- Baris 7-11 (
saldo += 500dansaldo -= 200): Nilaisaldoberubah menjadi 1500 lalu 1300. Bentuksaldo += 500membaca nilai lama, menjumlahkannya dengan 500, lalu menulis hasilnya kembali — persis sepertisaldo = saldo + 500, tetapi namasaldohanya ditulis sekali. - Baris 16 (
stok /= 4): Nilai 90 dibagi 4 menjadi 22, bukan 22.5, karenastokbertipe integer dan pembagian bulat memotong pecahan sebagaimana dibahas pada chapter Operator Aritmatika . - Baris 18 (
stok %= 5): Sisa bagi 22 oleh 5 adalah 2. Bentuk%=menuliskan sisa tersebut kembali kestok. - Baris 23-26 (
izin |= 0b0010danizin &^= 0b0001): Operator bitwise gabungan menyalakan bit kedua (0101menjadi0111), lalu mematikan bit pertama (0111menjadi0110). Pola ini melanjutkan contoh mask permission pada chapter Operator Bitwise . - Baris 29-33 (
skor["Budi"] += 25dst.): Operator gabungan juga sah dipakai pada elemen map. Assignmentskor["Siti"] += 10berhasil meskipun kunci"Siti"belum ada: pembacaan elemen map yang tidak dikenal menghasilkan zero value0, sehingga hasilnya 10.
Multiple Assignment dan Pertukaran Nilai #
Go menugaskan beberapa nilai sekaligus dalam satu statement. Kedua sisi dipisahkan tanda sama dengan dan jumlah nilai di kedua sisi harus sama. Bentuk paling terkenal adalah pertukaran dua nilai pada baris 37 program di atas: x, y = y, x menugaskan nilai lama y (2) ke x dan nilai lama x (1) ke y secara serentak, tanpa variable penampung sementara. Pemakaian lain yang akan sering kita temui adalah menampung hasil fungsi yang mengembalikan beberapa nilai sekaligus — topik yang dibahas tuntas pada Section Fungsi
.
Referensi #
- Spesifikasi Go: Assignments — aturan resmi assignment, operator gabungan, dan multiple assignment.
- Spesifikasi Go: Operators — peta seluruh operator yang memiliki bentuk gabungan.
- Effective Go — praktik penulisan kode Go yang idiomatik dari tim pengembangnya.
Dari semua penugasan, ada satu bentuk yang tampil hampir di setiap loop: menaikkan atau menurunkan nilai tepat satu. Chapter Increment dan Decrement
membahas operator ++ dan -- — beserta alasan Go membatasinya sebagai statement, bukan ekspresi.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
assignment.go
Unduh berkaspackage main
import "fmt"
func main() {
// Operator gabungan pada variable angka
saldo := 1000
saldo += 500
fmt.Println("setelah setoran :", saldo)
saldo -= 200
fmt.Println("setelah tarikan :", saldo)
stok := 30
stok *= 3
fmt.Println("setelah kalikan :", stok)
stok /= 4
fmt.Println("setelah bagi :", stok)
stok %= 5
fmt.Println("sisa bagi :", stok)
// Operator bitwise juga punya bentuk gabungan
izin := 0b0101
izin |= 0b0010
fmt.Printf("izin |= 0010 : %04b\n", izin)
izin &^= 0b0001
fmt.Printf("izin &^= 0001 : %04b\n", izin)
// Operator gabungan pada elemen map
skor := map[string]int{"Budi": 70}
skor["Budi"] += 25
skor["Siti"] += 10 // kunci baru mulai dari zero value 0
fmt.Println("skor Budi:", skor["Budi"])
fmt.Println("skor Siti:", skor["Siti"])
// Multiple assignment menukar dua nilai tanpa variable sementara
x, y := 1, 2
x, y = y, x
fmt.Println("x =", x, ", y =", y)
}