در بسیاری از مطالب مربوط به Golang بر استفاده از context و توانایی های آن مطالب زیادی گفته اند، انچه اینجا یاداشت میکنم برگرفته از یک فیلم اموزشی بر باره context در Golang است که برای اموزش خودم اینجا دوباره نویسی میکنم شاید به کار شما ها هم بیاد
context Pakage از پکیجهای درون برنامه ای Go هست به این معنی که نیاز نیست ان را به پروژه اضافه نماید
عموما برای کمک به مدیریت درخواستها و تنظیم deadline برای درخواستها در نظر گرفته شده است
هر Context دو چیز را به صورت عمومی مدیریت میکند Deadlin ها و کنسل کردن یک Operation که در goroutin ها در حال اجراست
به این معنی که با استفاده از Context میتوانید مطمئن شوید برنامه نشتی ندارد(در این مورد برنامه نویسیان حرفه ای بیشتر از من میدانند که نشتی میتواند برنامه در مقیاسهای بزرگ را عملا غیر قابل استفاده کند )
همینطور Context مبتواند اتصال به پایگاه داده ها را بهتر مدیریت کنید و یا درخواستهای شبکه را هندل نماید تا در زمان مناسب پایان دهد.
برای هر Contect package چهار کلمه کلیدی وجود دارد :
- Context Type: که در بر دارنده اطلاعات میان goroutin و function است ، میتواند در بر دارنده زمان پایان فانکشن و یا فرمان کنسل کردن فانکشن باشد و یا مقدادیر بین تابع و گوروتین را د رخود حمل کند.
- Context with Deadline: به شما امکان میدهد یک زمان Deadline برای عملکرد تعریف شده تنظیم کنید
- Context With timeout: به شما این امکان را میدهد تا زمان timeout برای تابع خود تعریف کنید و این امکان را میدهد تا زمان تابع را مدیریت کنید
- Contect With value: این امکان را به شما میدهد تا اطلاعات مورد نیاز بیشتری را به Context خود اضافه کنید با استفاده از Key تعریف شده ان را بازیابی کنید.
در نظر داشته باشید به کارگرفته Stack (پشته) در گوروتین ها در زمان استفاده از Context بسیار مهم است
میتوانید Context را به عنوان یه پارامتر و یا ارگومان استفاده کنید
و به یاد داشته باشید Context یک ابزار قوی برای برنامه های مقیاس پذیر است و برنامه را قابل اعتماد تر میکند
کاربرد ارسال اطلاعات با Context میتوان ارسال اطلاعات توکن احراز هویت و یا آی دی درخواست باشد (Authentication Token AND Request IDs) در یک برنامه چند لایه است.
پس تا اینحا فواید استفاده از Context استفاده آسان از ان و انعطاف پذیری و ایمینی در همزمانی میتوان نام برد.
همانطو رکه گفتیم برای میتوان یک سری اطلاعات را به Context اضافه نمود تا در جاهای دیگر برنامه از آن استفاده کرد. برای تعریف اطلاعات در Context:
ctx := Context.WithValue(parentContext,Key, Value)
برای دسترسی به اطلاعات داخل Context
val := ctx.Value(key)
Context Function ها به شما اجازه میدهند
1- طول عمر و یا کنسل کردن یه عملیات را مدیریت کنید
2- میتوانید یک Context جدید با عمکرد های جدید ایجاد کنید
در همین راستا به یاد داشته باشید Context Function با WithCancel میتوانید یک کانتکس جدید با همراهی Cancel Function برگرداند
ویا WithTimeout میتواند یک Context جدید برگرداند با همراهی یک زمان برای لغو عملکرد تعریف شده.
ctx, cancel:= context.WithCancel(Context.Background())
defer cancel()
go func(){
//opereation goes here
cancel()
}()
ctx, cancel:= context.WithTimeout(Context.Background(),
time.Duration(time.Milliesecond*100))
defer cancel()
req= req.WithContext(ctx)
دو متد برای مدیریت Context درایم
1- Deadline که به شما این امکان را میدهد Deadline را در Context بازیابی کنید
2- Done زمانی که Context به پایان رسیده یا کنسل شده است که یک کانال به شما برمیگرداند