Maison >développement back-end >Golang >Comment puis-je accéder aux champs de structure privés dans les packages Go Across ?

Comment puis-je accéder aux champs de structure privés dans les packages Go Across ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-22 04:26:11166parcourir

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

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 :

  • Exposer une méthode dédiée : Exporter une méthode dans le package d'origine qui fournit un accès contrôlé au privé champs.
  • Utilisez un type intégré : Créez un type intégré dans le package où l'accès aux champs privés est nécessaire et exportez ce type intégré.

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