سلام دوستان
تو این قسمت می خوایم درمورد تابع صحبت کنیم که یکی از مهم ترین امکانات هر زبان برنامه نویسی هست.
تابع
در برنامهنویسی، تابع به تکه کدهایی سازمان یافته گفته می شه که برای انجام عملی خاص استفاده میشن. به کمک توابع می تونیم تکه کدهارو از هم جدا کنیم و از دوباره نویسی کدهای تکراری که یه کار مشابه رو انجام میدن جلوگیری کنیم و به برنامه مون نظم بیشتری بدیم.
برای مثال ممکنه چندین جای برنامه نیاز به محاسبه ی سری فوریه داشته باشیم، به جای اینکه لازم باشه هر بار کد محاسبه رو بنویسیم که هم باعث دوباره نویسی و شلوغی و طولانی شدن کد و هم باعث سخت شدن تغییر میشه، اون رو به صورت یه قطعه کد مجزا به اسم تابع می نویسیم و هر جا لازم شد ازش استفاده می کنیم.
این طوری اگه نیاز به تغییر اون باشه با یه بار تغییر دادن تو همه جا این تغییر اعمال میشه.
عکس زیر مفهوم تابع رو نشون میده
استفاده از تابع مزایای زیر رو برامون داره
نحوه تعریف تابع
func function_name( [parameter list] ) [return_types] { // body of the function }
یه مثال کاربردی و ساده رو بیشتر توضیح میدم:
package main import "fmt" 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 "fmt" 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 "fmt" 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 "fmt" func sum(nums ...int) { fmt.Print(nums, " ") 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 "fmt" func main() { // anonymous function var sum = func(n1, n2 int) int { sum := n1 + n2 return sum } // function call result := sum(5, 3) fmt.Println("Sum is:", result) }
از آنجایی که توابع ناشناس نامی ندارد ما در بعضی اوقات آن ها را به یک متغیر اختصاص می دیم سپس از نام متغیر برای فراخوانی تابع استفاده می کنیم. در این مثال می بینید که ما از sum برای فراخوانی تابع استفاده می کنیم.
مانند توابع معمولی ما میتونیم برای تابع ناشناس پارامتر تعریف کنیم و مقداری را از تابع برگردانیم در این مثال تابع دو مقدار با نوع داده int دریافت میکنه و یک خروجی با نوع int داره.
تابع ناشناس را می توانیم برای عملکردهایی که نیازی به نامگذاری ندارند و معمولا برای استفاده کوتاه مدت هست، استفاده کنیم.
اما یکی از موارد کاربردی توابع ناشناس در گولنگ پاس دادن آن ها به توابعی هستن که تابعی را به عنوان پارامتر ورودی دریافت میکنن. در مثال زیر ما یک تابع تعریف کردیم که در پارامتر سوم یک تابع دریافت میکنه که باید دو ورودی int و یک خروجی int داشته باشه.
package main import "fmt" func add10AndSum(num1 int, num2 int, sum func(n1, n2 int) int) { result := sum(num1+10, num2+10) fmt.Println("Sum by adding 10 is:", result) } func main() { add10AndSum(5, 3, func(n1, n2 int) int { sum := n1 + n2 return sum }) }
توابع از پیش تعریف شده (Built-in Function)
در گو علاوه بر تابع هایی که توسط کابر تعریف میشه. یکسری توابع وجود داره که از قبل توسط طراحان این زبان برای سهولت کار برنامه نویسان نوشته شدن. از این لینک می تونید لیست اون ها رو ببینید.