Maison >développement back-end >Golang >Comment puis-je accéder aux champs de structure privés dans Go à partir de packages externes ?
Accès aux champs de structure privés à partir de packages externes
Dans Go, les champs privés d'une structure sont destinés à être inaccessibles en dehors du package où ils se trouvent défini. Cependant, il existe des situations dans lesquelles il peut être nécessaire d'accéder à ces champs privés à partir d'un autre package, par exemple à des fins de tests.
Utiliser Reflection
Une façon d'accéder aux champs privés les champs d'un autre package utilisent la réflexion. La réflexion consiste à examiner la structure interne d'un objet au moment de l'exécution. L'extrait de code suivant montre comment lire les champs privés à l'aide de la réflexion dans les versions Go antérieures à 1.7 :
import ( "fmt" "reflect" ) func read_foo(f *Foo) { v := reflect.ValueOf(*f) y := v.FieldByName("y") fmt.Println(y.Interface()) }
Utilisation de Unsafe
Dans les versions Go 1.7 et ultérieures, l'accès les champs privés utilisant la réflexion sont considérés comme dangereux. Alternativement, vous pouvez utiliser le package non sécurisé pour contourner les restrictions d'accès. Cependant, cette méthode est fortement déconseillée car elle n'est pas portable et peut entraîner un comportement inattendu si la structure de l'objet change.
L'extrait de code suivant montre comment utiliser unsafe pour accéder et modifier des champs privés :
import "unsafe" func change_foo(f *Foo) { // Advance pointer by field size to reach desired member ptrTof := unsafe.Pointer(f) ptrTof = unsafe.Pointer(uintptr(ptrTof) + uintptr(8)) // 8 is the size of an int on a 64-bit machine ptrToy := (**Foo)(ptrTof) *ptrToy = nil // Nullify y }
Alternatives
Il est généralement recommandé d'éviter d'accéder aux champs privés à partir de packages externes, car cela viole les principe d'encapsulation. Envisagez plutôt les alternatives suivantes :
Considérations sur les tests en boîte blanche
Si vous effectuez des tests en boîte blanche, l'utilisation de la réflexion ou unsafe peut être acceptable car vous avez accès au code source. Dans de tels cas, vous pouvez créer un package de test distinct qui définit les fonctions permettant d'accéder aux champs privés. Cependant, il est important de noter que ces tests ne seront pas hermétiques et pourront se comporter de manière inattendue si la structure de l'objet change.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!