خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

درک زمینه ها در Go

یاد بگیرید که چگونه از زمینه ها برای انتقال اطلاعات در زنجیره اجرای برنامه خود و مدیریت محدودیت های زمانی استفاده کنید.

Context یکی از ویژگی های مهم در Go است که همزمانی را فعال می کند. در Go، “context” به بسته ای اشاره دارد که عملکردی را برای مقادیر محدوده درخواست و سیگنال های لغو در سراسر مرزهای API ارائه می دهد.

بسته زمینه به طور همزمان با مدل همزمانی Go، بر اساس مفهوم گوروتین ها کار می کند. گوروتین ها رشته های اجرائی سبکی هستند که می توانید آن ها را ایجاد و مدیریت کنید و ایجاد برنامه های همزمان در Go را آسان می کند.

بسته زمینه

بسته زمینه عملکردی را برای لغو عملکردهای طولانی مدت یا کل زنجیره تماس فراهم می کند. این بسته همچنین به ذخیره مقادیر با محدوده درخواست برای دسترسی به هر نقطه در زنجیره تماس کمک می کند. این ویژگی هنگام کار با APIها یا ریزسرویس‌ها مفید است، جایی که درخواست‌ها ممکن است چندین فراخوانی عملکرد را در بر گیرند و بخواهید آنها را لغو کنید یا مقادیر خاصی را به آنها اضافه کنید.

در اینجا نحوه وارد کردن بسته زمینه در برنامه های Go آمده است.

import "context"

توابع Context نوع ساختار Context بسته زمینه را می گیرند. به طور معمول، شما باید از ctx به عنوان نام متغیر نمونه استفاده کنید.

func operations(ctx context.Context) {
}

توابع می توانند نوع ساختار Context را برای سایر توابع و عملیات برگردانند.

func operations(ctx context.Context) context.Context {
}

شما می توانید یک زمینه جدید با تابع TODO بسته متنی ایجاد کنید. تابع TODO یک زمینه جدید با مقدار context.Done() ایجاد می کند، کانالی که با لغو متن بسته می شود. هنگامی که به یک زمینه نیاز دارید اما هیچ زمینه والدینی مناسب نیست، باید از آن به عنوان یک مکان نگهدار استفاده کنید.

import "context"

func main() {
    ctx := context.TODO()
}

از طرف دیگر، تابع Background یک زمینه جدید بدون مقدار و یک کانال Done خالی ایجاد می کند.

ctx := context.Background()

شما باید از تابع Background به عنوان ریشه درخت زمینه استفاده کنید.

مطلب مرتبط:   5 سایت عالی برای برنامه نویسی طنز

زمینه با ارزش ها

بسته زمینه عملکردی را برای انتشار مقادیر و سیگنال های لغو ارائه می دهد. می‌توانید از مقادیر برای اطلاعات از داده‌های محدوده درخواست گرفته تا سیگنال‌های لغو و مهلت‌ها استفاده کنید.

بسته زمینه همچنین امکان ایجاد زمینه فرزند به ارث رسیده از زمینه‌های والد را فراهم می‌کند، که امکان مدیریت کارآمد مقادیر و سیگنال‌های لغو را در سراسر برنامه فراهم می‌کند، زیرا می‌توانید زمینه را از طریق چندین عملکرد عبور دهید.

در اینجا نمونه ای از عبور متن از توابع با بسته متنی آورده شده است.

import (
    "context"
)

func valuableContext(ctx context.Context) context.Context {
    return context.WithValue(ctx, "pass-key", "hfouneqcelkwfu")
}

func receiveContextData(ctx context.Context) any {
    passKey := ctx.Value("pass-key")
    return passKey
}

تابع valueContext یک نمونه متنی را می گیرد و یک نمونه متنی را برای تابع زیر برمی گرداند. نمونه متنی مقداری است که با متد WithValue ایجاد شده است. متد WithValue نمونه زمینه را از تابع و یک جفت کلید-مقدار می گیرد.

برای بازیابی داده‌ها از متن، باید یک زمینه جدید با تابع TODO یا Background ایجاد کنید و زمینه را به تابع (در این مورد valueContext) منتقل کنید و متن را با تابع receiveContextData دریافت کنید.

func main() {
    ctx := context.Background()
    ctx = valuableContext(ctx)
    fmt.Println(receiveContextData(ctx))

}

متغیر ctx نمونه متنی از تابع Background است. تابع valueContext متغیر ctx را می گیرد و متن را با مقداری که تابع receiveContextData می گیرد برمی گرداند و مقدار را از جفت کلید-مقدار برمی گرداند.

زمینه با نتیجه کد ارزش

مهلت زمانی و مهلت های متن

بسته زمینه عملکردی را برای تنظیم وقفه ها و ضرب الاجل ها در عملیات فراهم می کند. تنظیم مهلت‌ها و ضرب‌الاجل‌ها برای عملیاتی که نیاز به جبران دارند مفید است.

مطلب مرتبط:   4 بسته برتر برای ورود به Node.js

تایم اوت ها مدت زمانی است که یک عملیات طول می کشد. شما می توانید یک بازه زمانی برای یک عملیات به مدت 4 ثانیه تنظیم کنید. پس از آن، زمینه درخواست را لغو می کند.

از سوی دیگر، یک مهلت، نقطه مطلقی را که یک عملیات باید لغو شود را مشخص می کند.

شما می توانید از روش WithTimeout برای تنظیم یک مهلت زمانی متن استفاده کنید. در اینجا نحوه تنظیم بازه زمانی 2 ثانیه ای آمده است.

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 2 * time.Second)
    defer cancel()

    // some operation
}

تابع اصلی یک زمینه با فاصله زمانی دو ثانیه ایجاد می کند. تابع WithTimeout یک تابع لغو را برمی‌گرداند که می‌توانید آن را برای لغو در خروجی تابع اصلی به تعویق بیندازید.

با روش WithDeadline می توانید مهلت اعلام کنید. روش WithDeadline در یک نمونه زمینه و یک زمان مهلت تعیین می شود.

func doSomething(ctx context.Context) {
    deadlineTime := time.Now().Add(1500 * time.Millisecond)
    ctx, ctxCancel := context.WithDeadline(ctx, deadlineTime)
    defer ctxCancel()

    // some operation

    ctxCancel()
}

تابع doSomething در یک متن قرار می گیرد و متغیر deadlineTime زمان قبل از مهلت متن است. متغیر ctx زمینه ای است که دارای مهلت است.

متغیر ctxCancel زمانی که زمینه از ضرب الاجل خود فراتر رود، زمینه را لغو می کند.

بهترین روش ها برای استفاده از زمینه ها در Go

از استفاده از زمینه ها به عنوان متغیرهای سراسری خودداری کنید. استفاده از زمینه‌ها به‌عنوان متغیرهای سراسری ممکن است منجر به رفتارهای کد غیرمنتظره و خطاهای دشوار ردیابی شود، و برای کاهش پیچیدگی کد، به‌دور از متن استفاده کنید.

مطلب مرتبط:   UseReducer Hook: Simplifying State Management در React

در نهایت، از زمینه ها به عنوان سیگنال استفاده کنید، نه تضمین. لغو یک زمینه تضمین نمی‌کند که اجرای همه برنامه‌ها متوقف شود. این صرفاً یک سیگنال است و گوروتین‌ها نسبت به زمینه‌ها ناشناس هستند.