Multiple Return Values

Go memungkinkan fungsi untuk mengembalikan beberapa nilai sekaligus. Ini sangat berguna untuk mengembalikan hasil dan status error, atau beberapa nilai yang saling berhubungan.

Contoh Masalah

Bagaimana cara membuat fungsi yang mengembalikan beberapa nilai? Misalnya:

  1. Mengembalikan hasil perhitungan dan error
  2. Mengembalikan beberapa hasil perhitungan
  3. Mengembalikan status operasi dan data

Penyelesaian

package main

import (
    "errors"
    "fmt"
    "math"
)

// 1. Fungsi dengan hasil dan error
func hitungAkar(angka float64) (float64, error) {
    if angka < 0 {
        return 0, errors.New("tidak bisa menghitung akar dari angka negatif")
    }
    return math.Sqrt(angka), nil
}

// 2. Fungsi dengan multiple hasil perhitungan
func hitungStatistik(angka []int) (min, max, avg float64) {
    if len(angka) == 0 {
        return 0, 0, 0
    }

    min = float64(angka[0])
    max = float64(angka[0])
    total := 0

    for _, n := range angka {
        if float64(n) < min {
            min = float64(n)
        }
        if float64(n) > max {
            max = float64(n)
        }
        total += n
    }
    
    avg = float64(total) / float64(len(angka))
    return
}

// 3. Fungsi dengan status dan data
func cariNama(daftar []string, cari string) (bool, int) {
    for i, nama := range daftar {
        if nama == cari {
            return true, i
        }
    }
    return false, -1
}

func main() {
    // Contoh 1: Menghitung akar
    angka := 16.0
    hasil, err := hitungAkar(angka)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Printf("Akar dari %.2f adalah %.2f\n", angka, hasil)
    }

    // Contoh dengan error
    angkaNegatif := -4.0
    hasil, err = hitungAkar(angkaNegatif)
    if err != nil {
        fmt.Println("Error:", err)
    }

    // Contoh 2: Statistik
    nilai := []int{78, 92, 85, 60, 88}
    min, max, avg := hitungStatistik(nilai)
    fmt.Printf("\nStatistik Nilai:\n")
    fmt.Printf("Minimum: %.2f\n", min)
    fmt.Printf("Maximum: %.2f\n", max)
    fmt.Printf("Rata-rata: %.2f\n", avg)

    // Contoh 3: Pencarian
    names := []string{"Alice", "Bob", "Charlie", "David"}
    nama := "Charlie"
    found, position := cariNama(names, nama)
    
    if found {
        fmt.Printf("\n%s ditemukan di posisi %d\n", nama, position)
    } else {
        fmt.Printf("\n%s tidak ditemukan\n", nama)
    }
}

Penjelasan Kode

  1. Return Nilai dan Error

    • Pattern umum di Go
    • Error sebagai nilai kedua
    • Nil jika tidak ada error
  2. Named Return Values

    • Variabel return dideklarasikan
    • Bisa menggunakan naked return
    • Meningkatkan keterbacaan
  3. Multiple Values

    • Bisa mengembalikan banyak nilai
    • Dipisahkan dengan koma
    • Tipe bisa berbeda

Output

Akar dari 16.00 adalah 4.00
Error: tidak bisa menghitung akar dari angka negatif

Statistik Nilai:
Minimum: 60.00
Maximum: 92.00
Rata-rata: 80.60

Charlie ditemukan di posisi 2

Tips

  • Gunakan multiple return untuk error handling
  • Named return untuk fungsi kompleks
  • Jangan terlalu banyak return value (max 3-4)
  • Selalu periksa error yang dikembalikan
  • Dokumentasikan arti setiap return value