חבילת ה-Go Context
רוב מפתחי ה-Go משתמשים ב-context.Context מבלי להבין אותו. רואים אותו ב-HTTP handlers, בקריאות למסד נתונים ובמתודות SDK. מתחילים רבים מעבירים את context.Background() בכל מקום.
הטעות הזו גורמת לבעיות. פונקציית Lambda עלולה להיתקע מעבר ל-timeout שלה. שאילתת מסד נתונים עלולה להמשיך לרוץ גם לאחר שהמשתמש התנתק.
ה-Context מאפשר לכם לשלוח אותות ביטול (cancellation signals) ודדליינים (deadlines) דרך הקוד שלכם. הוא עוזר לכם לענות על שלוש שאלות:
• האם הפעולה הזו צריכה להמשיך לרוץ? • מתי הפעולה הזו חייבת להסתיים? • אילו נתוני בקשה זורמים יחד עם הקריאה הזו?
לממשק (interface) ה-Context יש ארבע מתודות:
- Deadline(): מחזירה מתי ה-context יבוטל.
- Done(): מחזירה channel שנסגר כאשר ה-context מתבטל. השתמשו בזה בתוך הצהרות select כדי להפסיק עבודה.
- Err(): מחזירה מדוע ה-context נעצר (DeadlineExceeded או Canceled).
- Value(): שולפת נתונים בטווח הבקשה (request-scoped) כמו Trace ID.
ה-Context עובד כעץ. מתחילים עם context אב ויוצרים לו צאצאים (children).
Contexts שורשיים (Root Contexts):
- context.Background(): השתמשו בזה בתחילת התוכנית שלכם.
- context.TODO(): השתמשו בזה כ-placeholder במהלך refactoring.
Contexts צאצאים (Child Contexts):
- context.WithCancel(): מאפשר לעצור עבודה באופן ידני.
- context.WithTimeout(): עוצר עבודה לאחר משך זמן מסוים.
- context.WithDeadline(): עוצר עבודה בזמן מסוים.
- context.WithValue(): מעביר metadata כמו User IDs.
כלל קריטי: תמיד קראו לפונקציית ה-cancel. השתמשו ב-defer cancel() מיד לאחר