Maison >développement back-end >Golang >Comment puis-je accéder aux champs de structure privés dans les packages Go Across ?
Accès aux champs de structure privés dans les packages
Dans Go, il est courant d'encapsuler les données à l'aide de champs de structure privés pour masquer les données. Cependant, il peut y avoir des situations où il peut être nécessaire d'accéder à ces champs privés à partir d'un autre package, par exemple à des fins de tests en boîte blanche.
Approche basée sur la réflexion (Go < 1.7)
Grâce à la réflexion, il est possible de lire des champs de structure privés dans les versions Go antérieures à 1.7. Voici un exemple :
import ( "fmt" "reflect" "github.com/other-package/foo" ) func readFoo(f *foo.Foo) { v := reflect.ValueOf(*f) y := v.FieldByName("y") fmt.Println(y.Interface()) }
Cette approche vous permet de lire des champs privés, mais les tentatives de modification entraîneront une panique.
Approche basée sur un niveau de sécurité (Go ≥ 1.7)
Dans Go 1.7 et versions ultérieures, une approche plus directe utilisant le package unsafe peut être utilisée pour lire et modifier des fichiers privés. champs de structure. Cependant, cette méthode est déconseillée car elle repose sur une manipulation de pointeur de bas niveau et peut facilement entraîner une corruption de la mémoire et d'autres problèmes. Voici un exemple :
import ( "unsafe" "github.com/other-package/foo" ) func changeFoo(f *foo.Foo) { ptrTof := unsafe.Pointer(f) ptrTof = unsafe.Pointer(uintptr(ptrTof) + unsafe.Sizeof(foo.Foo{}.x)) ptrToy := (**foo.Foo)(ptrTof) *ptrToy = nil }
Approches alternatives
Pour maintenir l'encapsulation tout en facilitant les tests en boîte blanche, envisagez ces alternatives :
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!