آموزش golang - قدم نهم: تابع

سلام دوستانتو این قسمت می خوایم درمورد تابع صحبت کنیم که یکی از مهم ترین امکانات هر زبان برنامه نویسی هست.تابعدر برنامه‌نویسی، تابع به تکه کدهایی سازمان یافته گفته می شه که برای انجام عملی خاص استفاده میشن. به کمک توابع می تونیم تکه کدهارو از هم جدا کنیم و از دوباره نویسی کدهای تکراری که یه کار مشابه رو انجام میدن جلوگیری کنیم و به برنامه مون نظم بیشتری بدیم.برای مثال ممکنه چندین جای برنامه نیاز به محاسبه ی سری فوریه داشته باشیم، به جای اینکه لازم باشه هر بار کد محاسبه رو بنویسیم که هم باعث دوباره نویسی و شلوغی و طولانی شدن کد و هم باعث سخت شدن تغییر میشه، اون رو به صورت یه قطعه کد مجزا به اسم تابع می نویسیم و هر جا لازم شد ازش استفاده می کنیم.این طوری اگه نیاز به تغییر اون باشه با یه بار تغییر دادن تو همه جا این تغییر اعمال میشه.عکس زیر مفهوم تابع رو نشون میدهاستفاده از تابع مزایای زیر رو برامون دارهبا استفاده از توابع، می تونیم یک قطعه کد را یک بار بنویسیم و چندین بار از اون در برنامه استفاده کنیم.با استفاده از توابع، حجم کدنویسی ما کم تر میشه و سرعت توسعه نرم افزار بیشتر می شه.توابع به ما کمک می کنن تا کد خودمون رو به تکه هایی تقسیم کنیم تا برنامه ما خوانا و قابل درک باشه. همچنین نگهداری و اشکال زدایی کد را آسان تر می کنه.نحوه تعریف تابعfunc function_name( [parameter list] ) [return_types] { // body of the function }برای تعریف تابع باید از کلید واژه ی func استفاده کنیمنامگذاری تابع از قواعد نامگذاری شناسه ها پشتیبانی می کنه و باید یکتا باشه. همچنین نباید از کلمات کلیدی و نام توابع درونی برای اسم گذاری توابع استفاده کنیمهر تابع می تونه تعدادی ورودی داشته باشه و یا اصلا ورودی نداشته باشه. لیست پارامتر ها داخل پرانتزها قرار میگیره و باید نوع اون ها هم مشخص باشههر تابع می تونه تعدادی نوع برگشتی یا return types، داشته باشه یا نداشته باشه. این لیست بعد از پرانتزها قرار میگیره و فقط نوع داده باید نوشته بشه. همچنین اگه تعداد اون ها ۲ تا یا بیشتر باشه باید داخل پرانتز قرار بگیرن.تو قسمت body of the function، کدهای ما نوشته میشن. اگه تابع مقدار برگشتی داشته باشه با کلمه کلیدی return اون رو برمی گردونیم.یه مثال کاربردی و ساده رو بیشتر توضیح میدم:package main import &quotfmt&quot func plus(a int, b int) int { return a + b } func main() { result := plus(4, 13) fmt.Println(result) }تو این مثال یه تابع به اسم plus نوشتیم که دوتا پارامتر a , b که از نوع int هستن رو میگیره و با هم جمع می کنه و نتیجه رو برمی گردونه که اون هم از نوع int هست.تو بدنه ی تابع main ما تابع plus رو با اسم تابع و دو تا پارامتر ۴ , ۱۳ فراخوانی کردیم و چون مقدار بازگشتی داره اون رو به result نسبت دادیم. مقدار بازگشتی تابع که میشه ۱۷ داخل result ریخته میشه و تو خط بعدی چاپ میشه.مثال با چند نوع بازگشتیpackage main import &quotfmt&quot func vals() (int, int) { return 3, 7 } func main() { a, b := vals() fmt.Println(a) fmt.Println(b) _, c := vals() fmt.Println(c) }تو این مثال میبینید که تابع vals دو مقدار ۳ و ۷ رو بر می گردونه که ما اون ها رو توی متغیرهای a و b ریختیم و چاپ کردیم.اگه توجه کنید تو خط بعدی مقادیر بازگشتی رو به _ و c دادیم. توجه کنید که _ برای وقتی استفاده میشه که ما یک یا چند خروجی یه تابع رو نیاز نداشته باشیم. تو این مثال چون اول _ و سپس c قرار گرفته، پس مقدار ۳ استفاده نمیشه و مقدار ۷ توی c ریخته میشه.به _ ، blank identifier نیز گفته میشه. برای وقتی استفاده میشه که بخوایم تعدادی از خروجی های یه تابع صرف نظر کنیم. احتمالا جاهای زیادی نیاز باشه ازش استفاده کنید.مقادیر بازگشتی نام گذاری شده (Named Return Values)تو گو می تونیم مقادیر بازگشتی یه تابع رو اسم گذاری کنیم:package main import &quotfmt&quot func split(sum int) (x, y int) { x = sum * 4 / 9 y = sum - x return } func main() { fmt.Println(split(17)) }توجه کنید که تو این مورد ما return رو بدون مقادیر بازگشتی استفاده کردیم. تو این حالت که بهش Naked Return گفته میشه، مقادیر بازگشتی اسم گذاری شده برگشت داده میشن.سعی کنید از این نوع return کمتر استفاده کنید و در صورت نیاز فقط تو توابعی که کوتاه هستن استفاده کنید، چون باعث کاهش خوانایی کد میشه.توابع متنوع در گولنگ (Variadic Functions)یکی از قابلیت هایی گو داره اینه که می تونید توابعی رو تعریف کنید که به شما اجازه می ده هر چقدر پارامتر نیاز دارید بدون تعریف وارد تابع کنید.این نوع تابع بیشتر برای توابعی به کار میره که توی اون ها همه ی ورودی ها از یه نوع هستن و یه کار خاص که چندان به ورودی ها وابسته نیست انجام میشه مثل تابع جمع.package main import &quotfmt&quot func sum(nums ...int) { fmt.Print(nums, &quot &quot) total := 0 for _, num := range nums { total += num } fmt.Println(total) } func main() { sum(1, 2) sum(1, 2, 3) nums := []int{1, 2, 3, 4} sum(nums...) }توابع نانشناس در گولنگ (Anonymous Functions)در زبان گولنگ می توانیم تابع بدون نام تعریف کنیم که به عنوان توابع ناشناس شناخته می شن.package main import &quotfmt&quot func main() { // anonymous function var sum = func(n1, n2 int) int { sum := n1 + n2 return sum } // function call result := sum(5, 3) fmt.Println(&quotSum is:&quot, result) }از آنجایی که توابع ناشناس نامی ندارد ما در بعضی اوقات آن ها را به یک متغیر اختصاص می دیم سپس از نام متغیر برای فراخوانی تابع استفاده می کنیم. در این مثال می بینید که ما از sum برای فراخوانی تابع استفاده می کنیم.مانند توابع معمولی ما میتونیم برای تابع ناشناس پارامتر تعریف کنیم و مقداری را از تابع برگردانیم در این مثال تابع دو مقدار با نوع داده int دریافت میکنه و یک خروجی با نوع int داره.تابع ناشناس را می توانیم برای عملکردهایی که نیازی به نامگذاری ندارند و معمولا برای استفاده کوتاه مدت هست، استفاده کنیم.اما یکی از موارد کاربردی توابع ناشناس در گولنگ پاس دادن آن ها به توابعی هستن که تابعی را به عنوان پارامتر ورودی دریافت میکنن. در مثال زیر ما یک تابع تعریف کردیم که در پارامتر سوم یک تابع دریافت میکنه که باید دو ورودی int و یک خروجی int داشته باشه.package main import &quotfmt&quot func add10AndSum(num1 int, num2 int, sum func(n1, n2 int) int) { result := sum(num1+10, num2+10) fmt.Println(&quotSum by adding 10 is:&quot, result) } func main() { add10AndSum(5, 3, func(n1, n2 int) int { sum := n1 + n2 return sum }) }توابع از پیش تعریف شده (Built-in Function)در گو علاوه بر تابع هایی که توسط کابر تعریف میشه. یکسری توابع وجود داره که از قبل توسط طراحان این زبان برای سهولت کار برنامه نویسان نوشته شدن. از این لینک می تونید لیست اون ها رو ببینید. https://virgool.io/@saeedheydari/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-golang-%D9%82%D8%AF%D9%85-%D8%B5%D9%81%D8%B1-ufv22zb4j3bq https://virgool.io/@saeedheydari/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-golang-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-wyvs1idjyan2 https://virgool.io/@saeedheydari/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-golang-%D9%82%D8%AF%D9%85-%D8%B3%D9%88%D9%85-e3mxmjr1mp74 https://virgool.io/@saeedheydari/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-golang-%D9%82%D8%AF%D9%85-%DA%86%D9%87%D8%A7%D8%B1%D9%85-ydltpxgtgdlj https://virgool.io/@saeedheydari/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-golang-%D9%82%D8%AF%D9%85-%D9%BE%D9%86%D8%AC%D9%85-regehw9odr8y https://virgool.io/@saeedheydari/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-golang-%D9%82%D8%AF%D9%85-%D8%B4%D8%B4%D9%85-k6cpaqgybxz2 https://virgool.io/@saeedheydari/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-golang-%D9%82%D8%AF%D9%85-%D9%87%D9%81%D8%AA%D9%85-jf9cn4h6fgri https://virgool.io/@saeedheydari/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-golang-%D9%82%D8%AF%D9%85-%D9%87%D9%81%D8%AA%D9%85-%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7-%D9%88-constant-oqvlbp5q2hg6