توابع 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
}
قوانین مهم
- فقط یک پارامتر variadic در هر تابع
- باید آخرین پارامتر باشد
// ✅ درست
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 میکند!این مبحث بخشی از دوره آموزش کامل گو است.