Maison >développement back-end >Golang >Comment puis-je accéder aux champs privés dans différents packages Go ?

Comment puis-je accéder aux champs privés dans différents packages Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-24 18:37:14583parcourir

How Can I Access Private Fields in Go Across Different Packages?

Accessibilité des champs privés dans tous les packages

Considérez le scénario dans lequel une structure définie dans un package (par exemple, foo) contient des champs privés et un autre package (par exemple, un bar) nécessite d'y accéder. Malheureusement, l'encapsulation au niveau du package Go interdit l'accès direct aux champs privés à partir de packages externes.

Cependant, il existe des moyens limités d'accéder à ces champs privés, avec certaines mises en garde :

Utilisation Réflexion (Go < 1.7)

Avant Go 1.7, il était possible de lire des messages privés champs utilisant la réflexion :

package bar

import "../foo"
import "fmt"
import "reflect"

func read_foo(f *foo.Foo) {
    v := reflect.ValueOf(*f)
    y := v.FieldByName("y")
    fmt.Println(y.Interface())
}

Cette approche permet la récupération des valeurs de champs privés mais pas leur modification.

Manipulation de la mémoire (Go >= 1.7)

Dans les versions Go 1.7 et supérieures, une méthode moins souhaitable consiste à manipuler la mémoire directement à l'aide de pointeurs non sécurisés. En avançant le pointeur mémoire en fonction de la taille et du décalage du champ, il est possible d'accéder à des champs privés :

package bar

import "../foo"
import "unsafe"

func change_foo(f *foo.Foo) {
    ptrTof := unsafe.Pointer(f)
    ptrTof = unsafe.Pointer(uintptr(ptrTof) + uintptr(8)) // Advance by the size of int
    ptrToy := (**foo.Foo)(ptrTof)
    *ptrToy = nil
}

Cette méthode est fortement déconseillée en raison de sa nature non portable et de son potentiel de corruption des données.

Solutions alternatives

Au lieu d'accéder directement aux champs privés, il existe des solutions plus appropriées options :

  • Déplacez la logique qui nécessite un accès aux champs dans le même package que la structure.
  • Exportez une interface sécurisée ou des méthodes qui fournissent un accès contrôlé aux champs privés.
  • Envisagez d'utiliser des tests en boîte blanche (en nommant les tests _test.go) pour permettre l'accès aux champs privés au sein du même package.

N'oubliez pas que le but de l'encapsulation est de maintenir l'intégrité des données et d'empêcher toute modification involontaire. S'il est nécessaire d'accéder à des champs privés, réfléchissez attentivement s'il existe une alternative plus appropriée.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn