Multiple Return Values — Go

Multiple Return Values Salah satu fitur paling khas Go: fungsi bisa mengembalikan lebih dari satu nilai. Ini sangat penting untuk pola error handling di Go…

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: bagiTagihan mengembalikan dua nilai, tapi kamu cuma menulis perOrang := bagiTagihan(32000, 3). Apa yang terjadi: perOrang dapat 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
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:

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

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

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.

Yang akan kamu pelajari