Τι είναι το Reflection στο Golang

Ti Einai To Reflection Sto Golang



Η αντανάκλαση στο Golang επιτρέπει σε ένα πρόγραμμα να εξετάζει και να τροποποιεί δομές δεδομένων, τύπους και τιμές κατά το χρόνο εκτέλεσης. Παρέχει ένα σύνολο συναρτήσεων που μας επιτρέπουν να εξετάσουμε τον τύπο και την τιμή οποιασδήποτε μεταβλητής κατά το χρόνο εκτέλεσης, να δημιουργήσουμε νέες περιπτώσεις τύπων και να τροποποιήσουμε την τιμή των υπαρχουσών μεταβλητών. Αυτό το άρθρο καλύπτει διαφορετικές συναρτήσεις Golang στο πακέτο ανάκλασης.

Πίνακας περιεχομένων

Το Go είναι μια στατικά πληκτρολογημένη γλώσσα, επομένως ο τύπος μιας μεταβλητής πρέπει να είναι γνωστός κατά το χρόνο μεταγλώττισης. Ωστόσο, σε ορισμένα σενάρια, μπορεί να είναι απαραίτητος ο χειρισμός τιμών των οποίων οι τύποι δεν μπορούν να προσδιοριστούν μέχρι να εκτελεστεί το πρόγραμμα.







Για παράδειγμα, μπορεί να χρειαστεί να γράψουμε μια συνάρτηση που μπορεί να λειτουργήσει με διαφορετικούς τύπους ορισμάτων ή μπορεί να χρειαστεί να σειριοποιήσουμε και να αποσειροποιήσουμε δεδομένα αγνώστων τύπων. Εδώ χρησιμοποιείται το πακέτο ανακλών στο Golang.



Reflect Package in Go

Το πακέτο ανακλών παρέχει ένα σύνολο συναρτήσεων που μας επιτρέπουν να επιθεωρούμε και να χειριζόμαστε τιμές κατά το χρόνο εκτέλεσης, ανεξάρτητα από τους τύπους τους. Με αυτές τις συναρτήσεις, μπορούμε να λάβουμε πληροφορίες σχετικά με τον τύπο και την τιμή οποιασδήποτε μεταβλητής, να δημιουργήσουμε νέες περιπτώσεις τύπων και να τροποποιήσουμε την τιμή των υπαρχουσών μεταβλητών.



Το πακέτο ανάκλασης στο Golang περιέχει δύο τύπους: Τύπος και τιμή. Ένας Τύπος αντιπροσωπεύει έναν τύπο Go, όπως int, string ή μια προσαρμοσμένη δομή. Μια τιμή αντιπροσωπεύει μια τιμή ενός συγκεκριμένου τύπου, όπως 42 ή 'γεια'.





Το πακέτο reflect παρέχει επίσης ένα σύνολο συναρτήσεων που μας επιτρέπουν να λαμβάνουμε αντικείμενα Type και Value από μεταβλητές. Για παράδειγμα, η συνάρτηση reflect.TypeOf() επιστρέφει ένα αντικείμενο Type που αντιπροσωπεύει τον τύπο μιας μεταβλητής, ενώ η συνάρτηση reflect.ValueOf() δίνει ένα αντικείμενο Τιμή που εμφανίζει τιμή μεταβλητής.

Στις επόμενες ενότητες, θα εξερευνήσουμε μερικές από τις συναρτήσεις που χρησιμοποιούνται συνήθως στο πακέτο ανακλών.



Reflekt. Συνάρτηση Copy().

Η συνάρτηση reflect.Copy() του πακέτου reflect χρησιμοποιείται για την αντιγραφή των τιμών ενός slice σε ένα άλλο slice. Χρειάζονται δύο παράμετροι, dst και src, και οι δύο πρέπει να είναι τιμές slice με τον ίδιο τύπο στοιχείου. Η συνάρτηση αντιγράφει τις τιμές από το slice src στο slice dst και επιστρέφει τον αριθμό των στοιχείων που αντιγράφηκαν.

Η συνάρτηση reflect.Copy() παρουσιάζεται στο ακόλουθο παράδειγμα:

πακέτο κύριος

εισαγωγή (

'fmt'
'κατοπτρίζω'
)
func κύριος () {
src := [] ενθ { 1 , 2 , 3 , 4 , 5 }
δστ := φτιαχνω, κανω ([] ενθ , μόνο ( src ))
n := κατοπτρίζω . αντίγραφο ( κατοπτρίζω . Αξία του ( δστ ), κατοπτρίζω . Αξία του ( src ))
fmt . Println ( n ) // Έξοδος: 5
fmt . Println ( δστ ) // Έξοδος: [1 2 3 4 5]


}

Σε αυτό το παράδειγμα, δημιουργούμε ένα τμήμα πηγής src με ορισμένες ακέραιες τιμές και ένα τμήμα προορισμού dst με το ίδιο μήκος με το src. Στη συνέχεια καλούμε την reflect.Copy() για να αντιγράψουμε τις τιμές από το src στο dst και να εκτυπώσουμε τον αριθμό των στοιχείων που αντιγράφηκαν (n) και τα περιεχόμενα του slice dst.

reflect.Συνάρτηση DeepEqual().

Η συνάρτηση reflect.DeepEqual() του πακέτου reflect χρησιμοποιείται για τη σύγκριση δύο τιμών για την ισότητα. Αυτή η συνάρτηση έχει δύο παραμέτρους εισόδου που είναι οι a και b, και οι δύο μπορεί να είναι οποιασδήποτε τιμής οποιουδήποτε τύπου. Η συνάρτηση επιστρέφει true εάν τα a και b είναι βαθιά ίσα, που σημαίνει ότι οι υποκείμενες τιμές τους είναι αναδρομικά ίσες. Διαφορετικά, αποδεικνύεται ψευδές.

Το παρακάτω παράδειγμα δείχνει πώς να χρησιμοποιήσετε την reflect.DeepEqual():

πακέτο κύριος

εισαγωγή (

'fmt'
'κατοπτρίζω'
)
func κύριος () {
ένα := [] ενθ { 1 , 2 , 3 }
σι := [] ενθ { 1 , 2 , 3 }
αν κατοπτρίζω . DeepEqual ( ένα , σι ) {
fmt . Println ( 'α και β είναι ίσα' )
} αλλού {
fmt . Println ( 'α και β δεν είναι ίσα' )
}


}

Σε αυτό το παράδειγμα, δημιουργούμε δύο φέτες a και b με τις ίδιες ακέραιες τιμές. Στη συνέχεια καλούμε την reflect.DeepEqual() για να συγκρίνουμε τα a και b για ισότητα και να εκτυπώσουμε το αποτέλεσμα.

reflect.Συνάρτηση Swapper().

Η συνάρτηση reflect.Swapper() του πακέτου reflect χρησιμοποιείται για την επιστροφή μιας συνάρτησης που μπορεί να ανταλλάξει τα στοιχεία ενός slice. Χρειάζεται μια παράμετρος, v, η οποία πρέπει να είναι μια τιμή slice. Η συνάρτηση επιστρέφει μια συνάρτηση που λαμβάνει δύο ακέραιους αριθμούς, i και j, και ανταλλάσσει τα στοιχεία του slice στις θέσεις i και j.

Η χρήση του reflect.Swapper() μπορεί να αποδειχθεί μέσω του παρακάτω παραδείγματος:

πακέτο κύριος

εισαγωγή (

'fmt'
'κατοπτρίζω'
)
func κύριος () {
μικρό := [] ενθ { 1 , 2 , 3 , 4 , 5 }
ανταλαγή := κατοπτρίζω . Ανταλακτής ( μικρό )
ανταλαγή ( 1 , 3 )
fmt . Println ( μικρό ) // Έξοδος: [1 4 3 2 5]


}

Σε αυτό το παράδειγμα, δημιουργήσαμε ένα slice με το όνομα s με κάποιες ακέραιες τιμές. Στη συνέχεια καλούμε την reflect.Swapper() για να πάρουμε μια συνάρτηση swap που μπορεί να ανταλλάξει στοιχεία του slice. Χρησιμοποιούμε το swap για να ανταλλάξουμε τα στοιχεία στις θέσεις 1 και 3 του slice και να εκτυπώσουμε το αποτέλεσμα.

Λειτουργία reflect.TypeOf().

Το reflect.TypeOf() χρησιμοποιείται για να πάρει τον τύπο μιας τιμής. Αυτή η συνάρτηση δέχεται μία παράμετρο 'v' που μπορεί να είναι οποιουδήποτε τύπου ή τιμής. Η συνάρτηση επιστρέφει μια τιμή reflect.Type που αντιπροσωπεύει τον τύπο της τιμής.

Η χρήση του reflect.TypeOf() μπορεί να αποδειχθεί μέσω του παρακάτω παραδείγματος:

πακέτο κύριος

εισαγωγή (

'fmt'
'κατοπτρίζω'
)
func κύριος () {
ήταν Χ float64 = 3 . 14
t := κατοπτρίζω . Του είδους ( Χ )
fmt . Println ( t ) // Έξοδος: float64


}

Σε αυτό το παράδειγμα, δημιουργούμε μια μεταβλητή float64 x με την τιμή 3.14. Στη συνέχεια καλούμε reflect.TypeOf() για να πάρουμε τον τύπο του x και να αποθηκεύσουμε το αποτέλεσμα σε μια μεταβλητή reflect.Type t. Εκτυπώνουμε την τιμή του t, που είναι float64.

Reflect.Συνάρτηση ValueOf().

Η reflect.ValueOf() μπορεί να πάρει μια αναπαράσταση reflect.Value μιας τιμής. Χρειάζεται μία μόνο παράμετρος v, η οποία μπορεί να είναι οποιαδήποτε τιμή οποιουδήποτε τύπου. Η συνάρτηση επιστρέφει μια τιμή reflect.Value που αντιπροσωπεύει την τιμή της παραμέτρου εισόδου.

Η χρήση του reflect.ValueOf() μπορεί να αποδειχθεί μέσω του παρακάτω παραδείγματος:

πακέτο κύριος

εισαγωγή (

'fmt'
'κατοπτρίζω'
)
func κύριος () {
ήταν Χ float64 = 3 . 14
σε := κατοπτρίζω . Αξία του ( Χ )
fmt . Println ( σε ) // Έξοδος: 3.14

}

Σε αυτό το παράδειγμα, δημιουργούμε μια μεταβλητή float64 x με την τιμή 3.14. Στη συνέχεια καλούμε reflect.ValueOf() για να πάρουμε μια αναπαράσταση ανακλαστικής τιμής του x και να αποθηκεύσουμε το αποτέλεσμα σε μια μεταβλητή ανακλαστικής τιμής v. Εκτυπώνουμε την τιμή του v, που είναι 3,14.

Το πακέτο ανακλών παρέχει πολλές λειτουργίες πέρα ​​από αυτές που αναφέρθηκαν, και αυτά είναι μόνο μερικά παραδείγματα. Χρησιμοποιώντας τις συναρτήσεις που παρέχονται από το πακέτο reflect, μπορούμε να δημιουργήσουμε κώδικα που μπορεί να λειτουργήσει με τιμές οποιουδήποτε τύπου, χωρίς να χρειάζεται να γνωρίζουμε τον τύπο κατά τη στιγμή της μεταγλώττισης.

συμπέρασμα

Η αντανάκλαση στο Golang επιτρέπει σε ένα πρόγραμμα να εξετάζει και να τροποποιεί δομές δεδομένων, τύπους και τιμές κατά το χρόνο εκτέλεσης. Υλοποιείται μέσω του πακέτου ανακλών, το οποίο παρέχει λειτουργίες επιθεώρησης και χειρισμού τύπων και τιμών. Το Reflection είναι ιδιαίτερα χρήσιμο όταν εργάζεστε με διεπαφές, άγνωστους τύπους ή όταν χρειάζεται να εφαρμόσετε γενικές συναρτήσεις. Αυτό το άρθρο εξέτασε τα βασικά του προβληματισμού στο Golang, συμπεριλαμβανομένου του πακέτου ανάκλασης, του τύπου και της τιμής και του δυναμικού τύπου και τιμής.