Το περιβάλλον είναι ένα από τα κρίσιμα χαρακτηριστικά στο Go που επιτρέπει τη ταυτόχρονη χρήση. Στο Go, το "context" αναφέρεται σε ένα πακέτο που παρέχει λειτουργικότητα για τιμές εύρους αιτήματος και σήματα ακύρωσης πέρα από τα όρια API.
Το πακέτο περιβάλλοντος λειτουργεί ταυτόχρονα με το μοντέλο συγχρονισμού του Go, που βασίζεται στην έννοια των γορουτίνων. Οι γορουτίνες είναι ελαφριά νήματα εκτέλεσης που μπορείτε να δημιουργήσετε και να διαχειριστείτε αποτελεσματικά, καθιστώντας εύκολη τη δημιουργία ταυτόχρονων προγραμμάτων στο Go.
Το Πακέτο Περιεχομένου
Το πακέτο περιβάλλοντος παρέχει λειτουργικότητα για την ακύρωση μακροχρόνιων λειτουργιών ή ολόκληρων αλυσίδων κλήσεων. Το πακέτο βοηθά επίσης στην αποθήκευση τιμών βάσει αιτήματος για πρόσβαση οπουδήποτε εντός της αλυσίδας κλήσεων. Αυτή η δυνατότητα είναι χρήσιμη όταν εργάζεστε με
API ή μικροϋπηρεσίες, όπου τα αιτήματα μπορεί να καλύπτουν πολλαπλές κλήσεις λειτουργιών και θέλετε να τις ακυρώσετε ή να τους επισυνάψετε συγκεκριμένες τιμές.Δείτε πώς μπορείτε να εισαγάγετε το πακέτο περιβάλλοντος στο δικό σας Προγράμματα Go.
εισαγωγή"συμφραζόμενα"
Οι συναρτήσεις περιβάλλοντος λαμβάνουν το Συμφραζόμενα τύπος struct του πακέτου περιβάλλοντος. Συμβατικά, θα πρέπει να χρησιμοποιήσετε ctx ως όνομα της μεταβλητής παρουσίας.
funcεπιχειρήσεις(ctx πλαίσιο. Συμφραζόμενα) {
}
Οι συναρτήσεις μπορούν να επιστρέψουν τον τύπο δομής περιβάλλοντος για άλλες συναρτήσεις και λειτουργίες.
funcεπιχειρήσεις(ctx πλαίσιο. Συμφραζόμενα)συμφραζόμενα.Συμφραζόμενα {
}
Μπορείτε να δημιουργήσετε ένα νέο πλαίσιο με το ΝΑ ΚΑΝΩ λειτουργία του πακέτου περιβάλλοντος. Η συνάρτηση TODO δημιουργεί ένα νέο πλαίσιο με την τιμή του συμφραζόμενα. Εγινε(), ένα κανάλι που θα κλείσει με ακύρωση περιβάλλοντος. Θα πρέπει να το χρησιμοποιείτε ως σύμβολο κράτησης θέσης όταν χρειάζεστε ένα περιβάλλον, αλλά κανένα γονικό περιβάλλον δεν είναι κατάλληλο.
εισαγωγή"συμφραζόμενα"
funcκύριος() {
ctx := πλαίσιο. ΝΑ ΚΑΝΩ()
}
Εναλλακτικά, το Ιστορικό Η συνάρτηση δημιουργεί ένα νέο περιβάλλον χωρίς τιμή και ένα κενό κανάλι Done.
ctx := πλαίσιο. Ιστορικό()
Θα πρέπει να χρησιμοποιήσετε τη συνάρτηση φόντου ως τη ρίζα ενός δέντρου περιβάλλοντος.
Πλαίσιο με αξίες
Το πακέτο περιβάλλοντος παρέχει λειτουργικότητα για τη διάδοση τιμών και σημάτων ακύρωσης. Μπορείτε να χρησιμοποιήσετε τις τιμές για πληροφορίες από δεδομένα εμβέλειας αιτήματος έως σήματα ακύρωσης και προθεσμίες.
Το πακέτο περιβάλλοντος επιτρέπει επίσης τη δημιουργία θυγατρικού περιβάλλοντος που κληρονομείται από γονικά περιβάλλοντα, επιτρέποντας την αποτελεσματικότητα χειρισμός τιμών και σημάτων ακύρωσης σε ένα πρόγραμμα, καθώς μπορείτε να περάσετε το περιβάλλον μέσω πολλών λειτουργίες.
Ακολουθεί ένα παράδειγμα διέλευσης περιβάλλοντος μέσω συναρτήσεων με το πακέτο περιβάλλοντος.
εισαγωγή (
"συμφραζόμενα"
)funcvalueContext(ctx πλαίσιο. Συμφραζόμενα)συμφραζόμενα.Συμφραζόμενα {
ΕΠΙΣΤΡΟΦΗ συμφραζόμενα. WithValue (ctx, "αντικλείδι", "hfouneqcelkwfu")
}
funcreceiveContextData(ctx πλαίσιο. Συμφραζόμενα)όποιος {
passKey := ctx. Αξία("αντικλείδι")
ΕΠΙΣΤΡΟΦΗ αντικλείδι
}
ο valueContext Η συνάρτηση παίρνει σε μια παρουσία περιβάλλοντος και επιστρέφει μια παρουσία περιβάλλοντος για την ακόλουθη συνάρτηση. Η παρουσία περιβάλλοντος είναι μια τιμή που δημιουργείται με το WithValue μέθοδος. Η μέθοδος WithValue παίρνει το παράδειγμα περιβάλλοντος από τη συνάρτηση και ένα ζεύγος κλειδιού-τιμής.
Για να ανακτήσετε τα δεδομένα από το περιβάλλον, θα χρειαστεί να δημιουργήσετε ένα νέο περιβάλλον με το ΝΑ ΚΑΝΩ ή Ιστορικό συνάρτηση και περάστε το περιβάλλον στη συνάρτηση (σε αυτήν την περίπτωση, valueContext) και λάβετε το πλαίσιο με το receiveContextData λειτουργία.
funcκύριος() {
ctx := πλαίσιο. Ιστορικό()
ctx = πολύτιμο πλαίσιο (ctx)
fmt. Println (receiveContextData (ctx))
}
Η μεταβλητή ctx είναι η παρουσία περιβάλλοντος από τη συνάρτηση φόντου. Η συνάρτηση valueContext λαμβάνει τη μεταβλητή ctx και επιστρέφει το περιβάλλον με μια τιμή που λαμβάνει η συνάρτηση receiveContextData και επιστρέφει την τιμή από το ζεύγος κλειδιού-τιμής.
Χρονικά όρια και προθεσμίες περιβάλλοντος
ο συμφραζόμενα Το πακέτο παρέχει λειτουργικότητα για τον ορισμό χρονικών ορίων και προθεσμιών στις λειτουργίες. Ο ορισμός χρονικών ορίων και προθεσμιών είναι χρήσιμος για λειτουργίες που πρέπει να καλύψουν τη διαφορά.
Τα χρονικά όρια είναι η διάρκεια του χρόνου που χρειάζεται μια λειτουργία. Μπορείτε να ορίσετε ένα χρονικό όριο για μια λειτουργία που διαρκεί 4 δευτερόλεπτα. Μετά από αυτό, το περιβάλλον ακυρώνει το αίτημα.
Από την άλλη πλευρά, μια προθεσμία ορίζει το απόλυτο σημείο όπου μια πράξη πρέπει να ακυρωθεί.
Μπορείτε να χρησιμοποιήσετε το WithTimeout μέθοδος ορισμού χρονικού ορίου πλαισίου. Δείτε πώς μπορείτε να ορίσετε ένα χρονικό όριο 2 δευτερολέπτων.
funcκύριος() {
ctx, ακύρωση := πλαίσιο. WithTimeout (πλαίσιο. Ιστορικό(), 2 * χρόνος. Δεύτερος)
αναβάλλω Ματαίωση()
// κάποια λειτουργία
}
ο κύριος η συνάρτηση δημιουργεί ένα πλαίσιο με χρονικό όριο δύο δευτερολέπτων. Η συνάρτηση WithTimeout επιστρέφει μια συνάρτηση ακύρωσης που μπορείτε να αναβάλετε για ακύρωση κατά την έξοδο από την κύρια λειτουργία.
Μπορείτε να δηλώσετε προθεσμίες με το Με Προθεσμία μέθοδος. Η μέθοδος WithDeadline λαμβάνει σε ένα παράδειγμα περιβάλλοντος και έναν χρόνο προθεσμίας.
funcΚάνε κάτι(ctx πλαίσιο. Συμφραζόμενα) {
προθεσμίαΧρόνος := χρόνος. Τώρα().Προσθήκη(1500 * χρόνος. Μιλιδευτερόλεπτο)
ctx, ctxΑκύρωση := πλαίσιο. WithDeadline (ctx, deadlineTime)
αναβάλλω ctxCancel()// κάποια λειτουργία
ctxCancel()
}
ο Κάνε κάτι η λειτουργία λαμβάνει σε ένα πλαίσιο, και το προθεσμία Ώρα μεταβλητή είναι ο χρόνος πριν από το συμφραζόμενα προθεσμία. ο ctx μεταβλητή είναι το πλαίσιο με προθεσμία.
ο ctxΑκύρωση η μεταβλητή ακυρώνει το περιβάλλον όταν το περιβάλλον υπερβαίνει την προθεσμία.
Βέλτιστες πρακτικές για τη χρήση περιεχομένων στο Go
Αποφύγετε να χρησιμοποιείτε περιβάλλοντα ως καθολικές μεταβλητές. Η χρήση των πλαισίων ως καθολικών μεταβλητών μπορεί να οδηγήσει σε απροσδόκητες συμπεριφορές κώδικα και δύσκολα ανιχνεύσιμα σφάλματα και η χρήση του περιβάλλοντος με φειδώ για τη μείωση της πολυπλοκότητας του κώδικα.
Τέλος, χρησιμοποιήστε τα περιβάλλοντα ως σήματα, όχι ως εγγυήσεις. Η ακύρωση ενός περιβάλλοντος δεν εγγυάται ότι όλες οι γορουτίνες θα σταματήσουν να εκτελούνται. είναι απλώς ένα σήμα και οι γορουτίνες είναι αγνωστικιστές των πλαισίων.