Saeed Heydari
Saeed Heydari
خواندن ۶ دقیقه·۲ سال پیش

آموزش 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


تابعبرنامه نویسیگوآموزش برنامه نویسیgolang
من سعید حیدری،برنامه نویس و طراح وب و از علاقه مندان دنیای گنو/لینوکس هستم. بک اند با لاراول وGolang و فرانت اند با vuejs, nuxtjs کار می کنم. همچنین به بلاکچین، هوش مصنوعی و اینترنت اشیا علاقه مندم.
شاید از این پست‌ها خوشتان بیاید