برنامه نویسی

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


نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا