Variadic Functions

Variadic Functions امکان ارسال تعداد دلخواه پارامترهای همنوع و ذخیره آنها در یک آرایه ساده را فراهم می‌آورد. برای ایجاد متدی که به تعداد دلخواه پارامتر دریافت کند، از علامت سه نقطه (…) به صورت زیر استفاده می‌شود :

func methodName (vaiableName ... dataType) dataType{
   ...
}

همانطور که در کد بالا مشاهده می کنید، کافیست، آرگومان هایی که متد قرار است دریافت کن را به صورت vaiableName … dataType بنویسید. یعنی یک نام، سپسس علامت … و در نهایت نوع متغیرها را ذکر کنید. به مثال زیر توجه کنید:

  1: package main
  2: 
  3: import "fmt"
  4: 
  5: func CalculateSum (numbers ... int) int {
  6:     var total int = 0
  7: 
  8:     for _, num := range numbers {
  9:             total += num
 10:         }
 11:     return total
 12: }
 13: 
 14: func main() {
 15:     fmt.Printf("1 + 2 + 3         = %d \n", CalculateSum(1, 2, 3))
 16:     fmt.Printf("1 + 2 + 3 + 4     = %d \n", CalculateSum(1, 2, 3, 4))
 17:     fmt.Printf("1 + 2 + 3 + 4 + 5 = %d \n", CalculateSum(1, 2, 3, 4, 5))
 18: }
1 + 2 + 3         = 6 
1 + 2 + 3 + 4     = 10 
1 + 2 + 3 + 4 + 5 = 15 

همانطور که در مثال بالا مشاهده می‌کنید، یک متد به نام ()CalculateSum در خط 5 تعریف شده است. برای اینکه این متد تعداد دلخواه پارامتر دریافت کند، از علامت سه نقطه (…) قبل از نوع داده‌ای پارامتر آن استفاده شده است. در اصل کلمه numbers یک آرایه است، که وقتی ما آرگومان‌ها را به متد ارسال می‌کنیم، در این آرایه ذخیره می‌شوند. حال متد را سه بار با تعداد مختلف آرگومانها فراخوانی می‌کنیم و سپس با استفاده از حلقه for این آرگومانها را جمع و به متد فراخوان برگشت می‌دهیم. وقتی از چندین پارامتر در یک متد استفاده می‌کنید، فقط یکی از آنها باید دارای علامت سه نقطه (…) بوده و همچنین از لحاظ مکانی باید آخرین پارامتر باشد. اگر این پارامتر (پارامتری که دارای سه نقطه است) در آخر پارامترهای دیگر قرار نگیرد و یا از چندین پارامتر سه نقطه دار استفاده کنید با خطا مواجه می‌شوید. به مثالهای اشتباه و درست زیر توجه کنید :

func SomeFunction(varidic ... x, y int) //ERROR

func SomeFunction(x int, varidic ... y) //Correct