توابع Variadic

توابع با تعداد آرگومان متغیر، پارامترهای ... و گسترش Slice.

تابع Variadic چیست؟

تابعی که می‌تواند تعداد نامشخصی آرگومان بپذیرد — مثل fmt.Println که هر تعداد آرگومان می‌گیرد!

تعریف با ...

func sum(numbers ...int) int {
    total := 0
    for _, n := range numbers {
        total += n
    }
    return total
}

// فراخوانی با هر تعداد آرگومان
sum(1, 2)           ← 3
sum(1, 2, 3, 4, 5)  ← 15
sum()               ← 0 (بدون آرگومان هم اوکی)

پارامتر numbers چیست؟

داخل تابع، numbers یک Slice از int است:

func printAll(args ...string) {
    fmt.Println(args)        ← [a b c]
    fmt.Println(len(args))   ← 3
}

قوانین مهم

// ✅ درست
func log(level string, messages ...string) { }

// ❌ غلط — variadic باید آخر باشد
func log(messages ...string, level string) { }

گسترش Slice با ...

اگر از قبل Slice دارید، با ... آن را باز کنید:

nums := []int{1, 2, 3}

sum(nums...)   ← مثل sum(1, 2, 3)

مثال‌های واقعی

// مثل fmt.Println
func log(prefix string, values ...any) {
    fmt.Print(prefix, ": ")
    fmt.Println(values...)
}

// ساخت رشته با جداکننده
func join(sep string, parts ...string) string {
    return strings.Join(parts, sep)
}
پارامتر values ...any (یا ...interface{}) یعنی هر نوعی — دقیقاً همان کاری که fmt.Println می‌کند!

این مبحث بخشی از دوره آموزش کامل گو است.

ابزارهای مرتبط