1 مفاهیم اولیه تابع‌ها

در برنامه‌نویسی، یک تابع قطعه‌ای از کد است که یک کار خاص را انجام می‌دهد و می‌تواند پارامتر‌های ورودی و مقادیر بازگشتی داشته باشد. در زبان Go، توابع به طور گسترده برای سازماندهی و استفاده مجدد از کد استفاده می‌شوند. استفاده موثر از توابع می‌تواند کد را مختصرتر، قابل خواندن‌تر و آسان‌تر برای نگهداری کند.

توابع جزء اصلی زبان Go محسوب می‌شوند و درک نحوه اعلان و تعریف توابع برای نوشتن کد‌های کارآمد و قابل خواندن بسیار حیاتی است.

2 تعریف توابع

2.1 اعلان تابع

در زبان Go، شکل عمومی اعلان تابع به صورت زیر است:

func نام‌تابع(پارامترها) نوع‌بازگشتی {
    // بدنه تابع
}

بیایید این اجزا را بررسی کنیم:

  1. کلمه کلیدی func برای اعلان یک تابع استفاده می‌شود.
  2. نام‌تابع نام تابع است که بر اساس کنوانسیون‌های زبان Go استفاده می‌شود. یک تابع با حرف اول بزرگ، قابل انتقال است، به این معنی که خارج از بسته قابل‌مشاهده است؛ یک تابع با حرف اول کوچک، قابل انتقال نیست و فقط می‌تواند در همان بسته استفاده شود.
  3. پارامترها لیست پارامتر‌هایی است که تابع دریافت می‌کند و با کاما از هم جدا می‌شوند. باید نوع هر پارامتر مشخص شود و اگر چندین پارامتر همان نوع دارند، نوع فقط یک‌بار مشخص می‌شود.
  4. نوع‌بازگشتی نوع مقدار بازگشتی تابع است. اگر تابع مقدار بازگشتی ندارد، این بخش می‌تواند حذف شود. اگر تابع چندین مقدار بازگشتی دارد، باید آن‌ها را در پرانتز قرار داد.

به عنوان مثال، ما می‌توانیم یک تابع ساده برای محاسبه جمع دو عدد صحیح اعلان کنیم:

func جمع(a int, b int) int {
    return a + b
}

در این مثال، نام تابع جمع، دو پارامتر از نوع int (a و b) را می‌گیرد و جمع آن‌ها را به عنوان مقدار بازگشتی با نوع int برمی‌گرداند.

2.2 لیست پارامترها

لیست پارامترها نحوه تعریف پارامترهایی که تابع قبول می‌کند و نوع هر پارامتر را مشخص می‌کند. پارامترها نوعی ویژه از متغیرها هستند که برای ارسال داده به یک تابع استفاده می‌شوند.

func سلام(name string, age int) {
    fmt.Printf("سلام، %s! تو %d ساله‌ای.\n", name, age)
}

در این تابع سلام، name و age پارامترها هستند. نوع name رشته و نوع age عدد صحیح است. هنگام فراخوانی این تابع، برای این پارامترها باید مقادیر واقعی ارائه شود.

2.3 نوع‌های بازگشتی

توابع می‌توانند نتایج محاسباتی را بازگردانند و نوع بازگشتی نوع مقدار بازگشتی تابع را تعریف می‌کند. توابع می‌توانند بدون مقدار بازگشتی باشند یا یک یا چند مقدار بازگشتی داشته باشند.

اگر یک تابع چندین مقدار بازگشتی داشته باشد، نوع آن‌ها باید در پرانتزها در زمان اعلان آن‌ها قرار گیرد:

func تقسیم(سودمند، مقسوم‌علیه float64) (float64, error) {
    if مقسوم‌علیه == 0 {
        return 0, errors.New("نمی‌توان بر صفر تقسیم کرد")
    }
    return سودمند / مقسوم‌علیه, nil
}

تابع تقسیم در اینجا دو مقدار را بازمی‌گرداند: نسبت و پیام خطا. اگر مقسوم‌علیه صفر باشد، یک خطا بازمی‌گردانده می‌شود.

2.4 پارامترهای متغیر

در گولنگ، زمانی که درحال تعریف یک تابع هستیم و نمی‌دانیم تماس‌گیرنده چه تعداد پارامتر را ارسال می‌کند، می‌توانیم از پارامترهای متغیر استفاده کنیم. پارامترهای متغیر با علامت سه نقطه ... نشان داده می‌شوند که به معنی این است که تابع می‌تواند هر تعدادی از پارامترها را قبول کند. این بسیار مفید است زمانی که با مقدار نامعلوم یا اجرای برخی از نوع‌های خاصی از توابع مانند فرمت‌بندی، خلاصه‌سازی یا توابع چرخشی درگیر هستیم.

صحنه‌های کاربرد

پارامترهای متغیر معمولاً در صحنه‌های کاربرد زیر استفاده می‌شوند:

  1. اتصال رشته: مانند توابع fmt.Sprintf و strings.Join.
  2. پردازش آرایه/برش: زمانی که با آرایه‌ها یا برش‌هایی از طول‌های متغیر دست و پنجه نرم کردند، مانند محاسبه مجموع یا اتصال چند برش.
  3. ثبت نشانه و رسیدگی به خطا: زمانی که برخورد با چندین خطا یا ثبت چندین اطلاعات ورودی بازگردانده شده است، مانند log.Printf یا توابع خطای سفارشی.
  4. توابع کمکی: استفاده می‌شود در APIها یا کتابخانه‌ها برای ارائه روش‌های انعطاف‌پذیرتری برای فراخوانی توابع.

استفاده از پارامترهای متغیر

در زیر یک مثال ساده از استفاده از پارامترهای متغیر وجود دارد:

// تعریف یک تابع که تعداد متغیری از پارامترهای عدد صحیح را می‌گیرد و جمع آن‌ها را برمی‌گرداند
func Sum(nums ...int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

func main() {
    // می‌توانید هر تعدادی از پارامترها را پاس دهید
    fmt.Println(Sum(1, 2))          // خروجی: 3
    fmt.Println(Sum(1, 2, 3, 4))    // خروجی: 10
    
    // همچنین می‌توانید یک آرایه از اعداد صحیح ایجاد کنید و بعد از آن از نقطه‌سه گذاشتن استفاده کرده و آرایه را پاس دهید
    numbers := []int{1, 2, 3, 4, 5}
    fmt.Println(Sum(numbers...))    // خروجی: 15
}

در تابع Sum، nums یک آرایه از اعداد صحیح است که شامل تمامی پارامترهای ارسالی به تابع Sum است. ما می‌توانیم از حلقه range برای گردش از این آرایه استفاده کرده و مجموع را محاسبه کنیم.

از این نکته باید اشاره کرد که پارامترهای متغیر درون تابع به واقع یک آرایه هستند، بنابراین تمامی عملیات مربوط به آرایه می‌تواند استفاده شود. زمانی که نیاز به ارسال یک آرایه به عنوان پارامتر متغیر به یک تابع دارید، فقط کافی است که پس از آرایه یک نقطه‌سه ... اضافه کنید.

استفاده از پارامترهای متغیر می‌تواند تماس‌های تابع را انعطاف‌پذیرتر و مختصرتر کند، اما این موضوع نیز تأثیر کوچکی بر عملکرد خواهد داشت، زیرا استفاده از پارامترهای متغیر شامل ایجاد آرایه و اختصاص حافظه است. بنابراین وقتی نیاز به عملکرد دقیق و سریع وجود دارد، باید مواظبت کرد.

نکته: توضیحات دقیق در مورد آرایه‌ها در فصول بعدی ارائه خواهد شد. اگر تجربه‌ای در زبان‌های برنامه‌نویسی دیگر دارید، می‌توانید به‌صورت موقت آن‌ها را به عنوان آرایه‌ها در نظر بگیرید.