GO – (8) توابع پیشرفته

توابع مرتبه بالاتر (HOF)
ما می توانیم توابع را به عنوان داده به عملکرد دیگری منتقل کنیم.
تابعی که عملکرد دیگری را به عنوان یک پارامتر در نظر می گیرد یا عملکرد دیگری را برمی گرداند ، a نامیده می شود عملکرد مرتبه بالاتربشر
func aggregate(a, b, c int, arithmetic func(int, int) int) int {
return arithmetic(arithmetic(a, b), c)
}
در aggregate ()
تابع چهار پارامتر می گیرد. همانطور که مشاهده می کنید ، آخرین عملکرد دیگر است. و aggregate ()
تابع دو بار عملکرد منتقل شده را فراخوانی می کند و یک INT را برمی گرداند.
عملکرد کلاس اول (FCF)
- تابعی که مانند متغیر دیگر رفتار می شود.
HOFS و FCF ها معمولاً به عنوان استفاده می شوند ،
- HTTP API دستگیرندگان
- میخانه/فرعی
- دستگیره ها را بر روی کلیک بر روی
کاری
- نوشتن تابعی که عملکرد/s را به عنوان پارامترها در نظر می گیرد و یک عملکرد جدید را برمی گرداند.
- در برنامه نویسی بسیار مورد استفاده قرار نمی گیرد.
// Takes two integers and returns their product
func multiply(x, y int) int {
return x * y
}
func doMath(mathFunc func(int, int) int) func (int) int {
return func(x int) int {
return mathFunc(x, x)
}
}
func main() {
squareFunc := doMath(multiply) // Pass the multiply function to doMath
fmt.Print(squareFunc(5))
}
در مثال بالا ، square(5)
داخلی انجام می دهد doMath(multiply(5, 5))
بشر بنابراین پاسخ نهایی 25 است. در اینجا ما چند برابر را در یک تابع جدید پیچیده ایم که همیشه به خودی خود یک عدد را ضرب می کند.
معاف کردن
- یک کلمه کلیدی منحصر به فرد برای رفتن.
- به یک تابع اجازه دهید تا قبل از بازگشت عملکرد محصور خود ، به طور خودکار اجرا شود.
چرا این است defer()
لازم است؟ مثال زیر را بررسی کنید. در copyFile
عملکرد دارای چندین بیانیه برگشتی است. هنگامی که یک پرونده را باز می کنید ، باید پس از اتمام استفاده از آن ، آن را ببندید. اما شما این کار را قبل از هر بیانیه بازگشت انجام داده اید. این خسته کننده است بنابراین در عوض ، می توانید از a استفاده کنید defer
بشر
func copyFile(desination, source string) (written int64, err error) {
src, err := os.Open(source) // open file
if err != nil { return }
defer src.Close()
dest, err := os.Create(desination) // create file
if err != nil { return }
defer dest.Close()
return io.Copy(dest, src) // copy source file content to dest file
}
بسته شدن
- توابع متغیرهای مرجع خارج از بدن عملکرد آنها.
- آنها همچنین ممکن است به متغیرهای ارجاع شده دسترسی داشته و اختصاص دهند.
// closure function
func counter() func() int {
count := 0
return func() int {
count++
return count
}
}
func main() {
c := counter()
fmt.Println(c()) // 1
fmt.Println(c()) // 2
fmt.Println(c()) // 3
d := counter() // new counter
fmt.Println(d()) // 1
}
در مثال بالا ، count
متغیر در counter()
خارج از بدنه عملکرد عملکرد بازگشت آن است. اما هر وقت تماس گرفتید c
(در عملکرد اصلی) بارها و بارها ، اشاره به count
افزایش یافته است
توابع ناشناس
- توابع بدون نام
- در بسته شدن یا هنگامی که یک تابع را به عنوان مقدار بازگشت باز می گردانید ، استفاده می شود.
مثال زیر را بررسی کنید.
func main() {
// Anonymous function assigned to a variable
greet := func(name string) string {
return "Hello, " + name
}
// Call the anonymous function
message := greet("Edward Cullen")
fmt.Println(message)
}
مثال بالا چاپ خواهد شد Hello, Edward Cullen