Variadic Functions

Fungsi variadic adalah fungsi yang bisa menerima jumlah parameter yang tidak tetap (variabel).

Contoh Masalah

Bagaimana cara membuat fungsi yang bisa menerima jumlah parameter yang berbeda-beda? Misalnya:

  1. Menjumlahkan beberapa angka
  2. Menggabungkan beberapa string
  3. Mencari nilai maksimum dari beberapa angka

Penyelesaian

package main

import (
    "fmt"
    "strings"
)

// 1. Fungsi untuk menjumlahkan beberapa angka
func sum(numbers ...int) int {
    total := 0
    for _, num := range numbers {
        total += num
    }
    return total
}

// 2. Fungsi untuk menggabungkan string dengan pemisah
func join(separator string, texts ...string) string {
    return strings.Join(texts, separator)
}

// 3. Fungsi untuk mencari nilai maksimum
func max(first int, rest ...int) int {
    maxNum := first
    for _, num := range rest {
        if num > maxNum {
            maxNum = num
        }
    }
    return maxNum
}

// 4. Fungsi dengan parameter normal dan variadic
func greeting(prefix string, names ...string) {
    for _, name := range names {
        fmt.Printf("%s %s\n", prefix, name)
    }
}

func main() {
    // Contoh 1: Penjumlahan
    fmt.Println("Sum(1, 2, 3):", sum(1, 2, 3))
    fmt.Println("Sum(5, 10, 15, 20):", sum(5, 10, 15, 20))
    
    // Menggunakan slice sebagai parameter
    numbers := []int{1, 2, 3, 4, 5}
    fmt.Println("Sum(numbers...):", sum(numbers...))

    // Contoh 2: Penggabungan string
    fmt.Println("\nJoin dengan koma:", 
        join(", ", "apple", "banana", "orange"))
    fmt.Println("Join dengan spasi:", 
        join(" ", "Hello", "World", "!"))

    // Contoh 3: Nilai maksimum
    fmt.Println("\nMax(1, 2, 3, 4):", max(1, 2, 3, 4))
    fmt.Println("Max(10, 5, 8, 12, 3):", max(10, 5, 8, 12, 3))

    // Contoh 4: Greeting
    fmt.Println("\nGreeting:")
    greeting("Hello", "Alice", "Bob", "Charlie")
    
    // Menggunakan slice untuk greeting
    names := []string{"David", "Eve", "Frank"}
    greeting("Hi", names...)
}

Penjelasan Kode

  1. Parameter Variadic

    • Menggunakan ... sebelum tipe
    • Harus di akhir parameter
    • Diterima sebagai slice
  2. Menggunakan Slice

    • Bisa passing slice dengan ...
    • Slice harus sesuai tipe
  3. Kombinasi Parameter

    • Bisa gabung dengan parameter normal
    • Variadic harus terakhir

Output

Sum(1, 2, 3): 6
Sum(5, 10, 15, 20): 50
Sum(numbers...): 15

Join dengan koma: apple, banana, orange
Join dengan spasi: Hello World !

Max(1, 2, 3, 4): 4
Max(10, 5, 8, 12, 3): 12

Greeting:
Hello Alice
Hello Bob
Hello Charlie
Hi David
Hi Eve
Hi Frank

Tips

  • Gunakan untuk parameter dengan jumlah tidak tetap
  • Parameter variadic harus di akhir
  • Perhatikan performa saat menggunakan slice besar
  • Dokumentasikan penggunaan yang valid
  • Bisa kombinasikan dengan parameter normal