Fungsi di Go
Fungsi adalah blok kode yang bisa dipanggil berulang kali. Di Go, fungsi dideklarasikan dengan keyword func.
Sintaks Dasar
func namaFungsi(param1 tipe1, param2 tipe2) tipeReturn {
// body
return nilai
}
Contoh
func tambah(a int, b int) int {
return a + b
}
// Jika parameter bertipe sama, bisa disingkat:
func kali(a, b int) int {
return a * b
}
func sapa(nama string) string {
return "Halo, " + nama + "!"
}
Fungsi tanpa Return
func cetakPesan(pesan string) {
fmt.Println(pesan)
}
Variadic Function
Fungsi yang menerima jumlah argumen tidak terbatas:
func jumlah(angka ...int) int {
total := 0
for _, n := range angka {
total += n
}
return total
}
fmt.Println(jumlah(1, 2, 3, 4, 5)) // 15
First-Class Function
Fungsi bisa disimpan dalam variabel dan dikirim sebagai parameter:
operasi := func(a, b int) int {
return a + b
}
fmt.Println(operasi(3, 4)) // 7
Named Return Values
Go punya fitur unik: kamu bisa memberi nama pada nilai return di signature fungsi. Variabel itu otomatis dideklarasikan di awal fungsi (dengan zero value) dan bisa langsung dipakai.
func persegi(sisi float64) (luas, keliling float64) {
luas = sisi * sisi
keliling = 4 * sisi
return // "naked return" — otomatis return luas & keliling
}
Kombinasi yang khas di Go: named return + defer untuk error handling dengan context:
func bacaFile(path string) (data []byte, err error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
defer func() {
if cerr := f.Close(); cerr != nil && err == nil {
err = cerr // modifikasi named return dari defer
}
}()
return io.ReadAll(f)
}
Kapan pakai named return?
- Saat fungsi panjang dan mau menandai makna tiap nilai return
- Saat butuh modifikasi return dari dalam
defer - Saat signature jadi dokumentasi yang jelas (
(result int, err error))
Hindari untuk fungsi pendek — naked return di fungsi panjang bisa bikin bingung. Style guide Go: "eksplisit > implisit" — tulis return luas, keliling lebih aman dibanding return kosong.