קוראים כמוך עוזרים לתמוך ב-MUO. כאשר אתה מבצע רכישה באמצעות קישורים באתר שלנו, אנו עשויים להרוויח עמלת שותף. קרא עוד.

ההקשר הוא אחת התכונות הקריטיות ב-Go המאפשרות במקביל. ב-Go, "הקשר" מתייחס לחבילה המספקת פונקציונליות עבור ערכים בהיקף בקשות ואותות ביטול על פני גבולות API.

חבילת ההקשר פועלת בו זמנית עם מודל המקבילות של Go, המבוסס על הרעיון של goroutines. Goroutines הם חוטים קלים של ביצוע שאתה יכול ליצור ולנהל ביעילות, מה שמקל על יצירת תוכניות במקביל ב-Go.

חבילת ההקשר

חבילת ההקשר מספקת פונקציונליות לביטול פונקציות ארוכות טווח או שרשראות שיחות שלמות. החבילה מסייעת גם באחסון ערכים בהיקף של בקשה לגישה בכל מקום בשרשרת השיחות. תכונה זו שימושית כאשר עובדים עם ממשקי API או מיקרו-שירותים, שבהם בקשות עשויות להשתרע על פני מספר שיחות פונקציה וברצונך לבטל אותן או לצרף להן ערכים ספציפיים.

כך תוכל לייבא את חבילת ההקשר שלך לך תוכניות.

יְבוּא"הֶקשֵׁר"

פונקציות ההקשר לוקחות את ה הֶקשֵׁר סוג struct של חבילת ההקשר. באופן קונבנציונלי, אתה צריך להשתמש ctx כשם משתנה המופע.

funcפעולות(הקשר של ctx. הֶקשֵׁר) {
}

פונקציות יכולות להחזיר את סוג מבנה ההקשר עבור פונקציות ופעולות אחרות.

instagram viewer
funcפעולות(הקשר של ctx. הֶקשֵׁר)הֶקשֵׁר.הֶקשֵׁר {
}

אתה יכול ליצור הקשר חדש עם לעשות פונקציה של חבילת ההקשר. הפונקציה TODO יוצרת הקשר חדש עם הערך של הֶקשֵׁר. בוצע(), ערוץ שייסגר עם ביטול הקשר. עליך להשתמש בו כמציין מיקום כאשר אתה זקוק להקשר אך אין הקשרים אב מתאימים.

יְבוּא"הֶקשֵׁר"

funcרָאשִׁי() {
ctx := הקשר. לעשות()
}

לחלופין, ה רקע כללי הפונקציה יוצרת הקשר חדש ללא ערך וערוץ Done ריק.

ctx := הקשר. רקע כללי()

עליך להשתמש בפונקציית רקע כשורש של עץ הקשר.

הקשר עם ערכים

חבילת ההקשר מספקת פונקציונליות להפצת ערכים ואותות ביטול. אתה יכול להשתמש בערכים עבור מידע, החל מנתונים בהיקף של בקשות ועד לאותות ביטול ותאריכים.

חבילת ההקשר מאפשרת גם יצירת הקשר ילד שהורש מהקשרי הורה, מה שמאפשר יעילות טיפול בערכים ובאותות ביטול לאורך תוכנית מכיוון שאתה יכול להעביר את ההקשר דרך מספר פונקציות.

הנה דוגמה להעברת הקשר דרך פונקציות עם חבילת ההקשר.

יְבוּא (
"הֶקשֵׁר"
)

funcvaluableContext(הקשר של ctx. הֶקשֵׁר)הֶקשֵׁר.הֶקשֵׁר {
לַחֲזוֹר הֶקשֵׁר. WithValue (ctx, "מפתח כניסה", "hfouneqcelkwfu")
}

funcreceiveContextData(הקשר של ctx. הֶקשֵׁר)כל {
passKey := ctx. ערך("מפתח כניסה")
לַחֲזוֹר מפתח סיסמה
}

ה valuableContext הפונקציה לוקחת מופע הקשר ומחזירה מופע הקשר עבור הפונקציה הבאה. מופע ההקשר הוא ערך שנוצר עם ה- WithValue שיטה. שיטת WithValue לוקחת את מופע ההקשר מהפונקציה וזוג מפתח-ערך.

כדי לאחזר את הנתונים מההקשר, תצטרך ליצור הקשר חדש עם לעשות אוֹ רקע כללי פונקציה והעבירו את ההקשר לפונקציה (במקרה זה, valuableContext) וקבלו את ההקשר עם receiveContextData פוּנקצִיָה.

funcרָאשִׁי() {
ctx := הקשר. רקע כללי()
ctx = valuableContext (ctx)
fmt. Println (receiveContextData (ctx))

}

המשתנה ctx הוא מופע ההקשר מפונקציית רקע. הפונקציה valuableContext לוקחת את המשתנה ctx ומחזירה את ההקשר עם ערך שהפונקציה receiveContextData לוקחת ומחזירה את הערך מצמד המפתח-ערך.

זמן קצוב של הקשר ותאריכים מועדים

ה הֶקשֵׁר החבילה מספקת פונקציונליות לקביעת זמני זמן ותאריכים בפעולות. קביעת זמן קצוב ותאריכים מועיל לפעולות שצריכות להתעדכן.

זמן קצוב הוא משך הזמן שלוקח פעולה. אתה יכול להגדיר פסק זמן לפעולה שייקח 4 שניות; לאחר מכן, ההקשר מבטל את הבקשה.

מצד שני, דד-ליין מגדיר את הנקודה המוחלטת שבה צריך לבטל פעולה.

אתה יכול להשתמש ב WithTimeout שיטה להגדיר פסק זמן של הקשר. כך תוכל להגדיר פסק זמן של 2 שניות.

funcרָאשִׁי() {
ctx, בטל := הקשר. WithTimeout (הקשר. רקע כללי(), 2 *זמן. שְׁנִיָה)
לִדחוֹת לְבַטֵל()

// פעולה כלשהי
}

ה רָאשִׁי הפונקציה יוצרת הקשר עם פסק זמן של שתי שניות. הפונקציה WithTimeout מחזירה פונקציית ביטול שתוכל לדחות לביטול ביציאה מהפונקציה הראשית.

אתה יכול להכריז על מועדים עם WithDeadline שיטה. שיטת WithDeadline לוקחת מופע הקשר וזמן מועד אחרון.

funcעשה משהו(הקשר של ctx. הֶקשֵׁר) {
deadlineTime := זמן. עכשיו().הוסף(1500 *זמן. אלפיות השנייה)
ctx, ctxCancel := הקשר. WithDeadline (ctx, deadlineTime)
לִדחוֹת ctxCancel()

// פעולה כלשהי

ctxCancel()
}

ה עשה משהו הפונקציה לוקחת בהקשר, וה- מועד אחרון משתנה הוא הזמן שלפני ה הֶקשֵׁר מועד אחרון. ה ctx משתנה הוא ההקשר עם מועד אחרון.

ה ctxCancel המשתנה מבטל את ההקשר כאשר ההקשר חורג מהדד-ליין שלו.

שיטות עבודה מומלצות לשימוש בהקשרים ב-Go

הימנע משימוש בהקשרים כמשתנים גלובליים. שימוש בהקשרים כמשתנים גלובליים עלול להוביל להתנהגויות קוד בלתי צפויות ולשגיאות קשות למעקב, ולהשתמש בהקשר במשורה כדי להפחית את מורכבות הקוד.

לבסוף, השתמש בהקשרים כאותות, לא ערבויות. ביטול הקשר אינו מבטיח שכל הגורוטינים יפסיקו לפעול; זה רק אות, וגורוטינים הם אגנוסטיים להקשרים.