برنامه نویسی

تعویق بیانیه ها در Go: یک دوره کوتاه تصادف

بیانیه تعویق چیست؟

در برو، یک defer دستور به شما امکان اجرای یک تابع را می دهد بعد از اجرای تابع حاوی آن به پایان رسیده است.

ساده ترین راه برای فکر کردن در مورد آن، یک تماس یا در نهایت مسدود کردن برای توسعه دهندگانی است که بیشتر با جاوا آشنا هستند.

معمولاً می بینید که از دستورات defer برای پاکسازی منابع مانند فایل ها و اتصالات پایگاه داده استفاده می شود.

به تعویق انداختن نحو بیانیه

func main() {
  myFile, err := os.Open("my-file.txt")
  defer myFile.close()

  if err != nil {
    panic(err)
  }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

موارد فوق نمونه ای از استفاده است defer برای پاک کردن منابع، در این مورد، بسته شدن یک فایل پس از اتمام کار با آن. این defer دستور تا بعد از ما اجرا نخواهد شد main متد اجرای خود را به پایان رسانده است.

استفاده از defer مستقیماً پس از باز کردن منبعی که باید به صورت دستی بسته یا مدیریت شود (مانند فایل ها!) بهترین روش است. به این ترتیب مطمئناً می دانید که هیچ منبعی باقی نمانده است و فراموش نمی کنید که بعداً آن را به صورت دستی در کد ببندید.

من دوست دارم چنین گزاره‌هایی را تا حد امکان نزدیک نگه دارم، در حالت ایده‌آل درست زیر خطی که منابع را باز می‌کند.

استفاده از عبارات تعویق چندگانه

defer عبارات روی یک پشته قرار می گیرند. به این معنی که آخرین دستور تعریف شده اولین موردی است که اجرا می شود. این چیزی است که پس از مواجهه با یک باگ گیج کننده خاص مجبور شدم به سختی یاد بگیرم!

کد زیر را در نظر بگیرید:

import "fmt"

func main() {
    defer deferredPrint("0")
    defer deferredPrint("1")
    defer deferredPrint("2")
}

func deferredPrint(s string) {
    fmt.Printf("%s\n", s)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی آن چه می تواند باشد؟

از آنجا که defer عبارات در پشته تماس (LIFO) قرار می گیرند که خروجی آن به صورت زیر است:

2
1
0
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه داشته باشید که آخرین تعریف شده است defer عبارت ابتدا اجرا می شود!

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

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

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

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