تعویق بیانیه ها در 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
عبارت ابتدا اجرا می شود!