Fungsi Go boleh mengembalikan lebih dari satu nilai sekaligus. Bayangin patungan di Warung Bakso Mas Bimo: tagihan tiga sahabat Rp32.000 (bakso urat, mie ayam, es teh) dibagi 3 orang. Kasir menjawab dua hal dari satu hitungan: "masing-masing Rp10.666, sisa Rp2". Urutannya selalu sama, bagian tiap orang dulu, baru sisanya, jadi yang mendengar tahu angka mana untuk apa.
🧪 Tebakan cepat:
bagiTagihanmengembalikan dua nilai, tapi kamu cuma menulisperOrang := bagiTagihan(32000, 3). Apa yang terjadi:perOrangdapat nilai pertama dan sisanya dibuang, atau compile gagal? Tebak dulu, jawabannya ada di bagian "Jumlah penerima harus pas".
Mengembalikan dua nilai
package main
import "fmt"
func bagiTagihan(total, orang int) (int, int) {
return total / orang, total % orang
}
func main() {
perOrang, sisa := bagiTagihan(32000, 3)
fmt.Println("per orang:", perOrang)
fmt.Println("sisa:", sisa)
}
$ go run bakso.go
per orang: 10666
sisa: 2
(int, int)sesudah parameter adalah daftar tipe hasil. Lebih dari satu hasil wajib ditulis di dalam kurung.return total / orang, total % orangmengembalikan dua nilai, dipisah koma, dengan urutan yang sama seperti daftar tipenya.perOrang, sisa := ...menerima keduanya sesuai urutan: nilai pertama masuk keperOrang, nilai kedua kesisa./pada duaintmembuang pecahan: 32000 / 3 = 10666.%memberi sisanya: 10666 × 3 = 31998, kurang 2 dari 32000.
orang |
perOrang |
sisa |
|---|---|---|
| 3 | 10666 | 2 |
| 4 | 8000 | 0 |
| 7 | 4571 | 3 |
Urutan di return yang menentukan siapa dapat apa. Fungsi swap(a, b int) (int, int) yang menulis return b, a membalik urutannya, jadi x, y := swap(3, 7) lalu fmt.Println(x, y) mencetak 7 3.
Jumlah penerima harus pas
Banyaknya variabel di kiri := harus sama dengan banyaknya nilai yang dikembalikan. Go gak membuang nilai diam-diam:
./bakso.go:10:14: assignment mismatch: 1 variable but bagiTagihan returns 2 values
Itu jawaban tebakannya: compile gagal. Tiga penerima juga ditolak dengan assignment mismatch: 3 variables but bagiTagihan returns 2 values.
Dua aturan lain ikut berlaku:
- Tiap variabel yang diterima harus dipakai.
perOrang, sisa := ...tanpa memakaisisagagal dengandeclared and not used: sisa. returnjuga harus lengkap.return total / orangsaja ditolak dengannot enough return values, lalu Go menunjukkanhave (int)danwant (int, int).
_: buang nilai yang gak dipakai
Butuh satu nilai saja? Taruh _ di tempat nilai yang mau dibuang:
perOrang, _ := bagiTagihan(32000, 3)
fmt.Println("per orang:", perOrang) // per orang: 10666
_ disebut blank identifier: tempat buang resmi untuk nilai yang gak kamu perlukan. Karena Go menolak variabel yang gak dipakai, _ adalah cara sah untuk bilang "nilai ini sengaja diabaikan". Ini _ yang sama dengan for _, m := range menu di lesson For Loop. _ boleh ditulis berkali-kali, tapi gak bisa dibaca: fmt.Println(_) gagal dengan cannot use _ as value or type.
Pola yang paling sering: (nilai, bool) dan (nilai, error)
Dua bentuk ini muncul di mana-mana di Go:
func cariHarga(nama string) (int, bool) {
harga := map[string]int{"Bakso urat": 15000, "Mie ayam": 12000, "Es teh": 5000}
h, ada := harga[nama]
return h, ada
}
fmt.Println(cariHarga("Es teh")) // 5000 true
fmt.Println(cariHarga("Soto")) // 0 false
(nilai, bool): hasilnya plus jawaban "ada atau gak". Ini comma-ok yang sama dengan membaca map.(nilai, error): hasilnya plus alasan kalau gagal.strconv.Atoi("50000")mengembalikan50000dannil(gak ada error), sedangkanstrconv.Atoi("50rb")mengembalikan0dan errorstrconv.Atoi: parsing "50rb": invalid syntax. Error selalu ditaruh paling akhir. Detailnya di lesson Error Handling.- Hasil ganda boleh langsung jadi argumen fungsi lain:
fmt.Println(cariHarga("Es teh"))mencetak keduanya.
Hasil yang diberi nama
Hasil boleh diberi nama di signature. Variabelnya sudah ada sejak awal fungsi, dan return kosong (bare return) mengembalikan isinya:
func bagiTagihan(total, orang int) (perOrang, sisa int) {
perOrang = total / orang
sisa = total % orang
return
}
fmt.Println(bagiTagihan(32000, 7)) // 4571 3
Nama perOrang, sisa int ikut jadi keterangan: orang yang membaca signature langsung tahu angka mana yang mana.
⚠️ Jebakan yang sering ketemu
- Jumlah penerima gak cocok. Satu atau tiga variabel untuk dua hasil berarti
assignment mismatch. Terima semuanya, dan buang yang gak perlu dengan_. - Menerima tapi gak dipakai.
declared and not used: sisa. Ganti namanya dengan_. - Membuang error dengan
_.uang, _ := strconv.Atoi("50rb")memberiuang= 0, dan program jalan terus seakan aman. Error yang dibuang adalah peringatan yang gak pernah dibaca. - Bagi dengan 0 orang.
bagiTagihan(32000, 0)gak ditolak compiler, tapi program berhenti di tengah jalan denganpanic: runtime error: integer divide by zero.
TL;DR: Fungsi Go bisa mengembalikan beberapa nilai: tulis tipenya di kurung, (int, int), lalu return a, b. Pemanggil menerima sesuai urutan, perOrang, sisa := bagiTagihan(32000, 3) memberi 10666 dan 2, dan swap(3, 7) dengan return b, a mencetak 7 3. Jumlah penerima harus pas (assignment mismatch kalau gak), dan semua penerima harus dipakai. _ (blank identifier) membuang nilai yang gak dibutuhkan. Pola paling umum: (nilai, bool) dan (nilai, error), dengan error paling akhir. Hasil boleh diberi nama, lalu bare return mengembalikannya.