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

Comment puis-je accéder aux champs de structure privés dans Go à partir de packages externes ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-21 01:59:09601parcourir

How Can I Access Private Struct Fields in Go from External Packages?

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 :

  • Déplacez la fonctionnalité de test dans le même package que les champs privés.
  • Exportez une interface ou fournissez des méthodes getter/setter pour autoriser l'accès externe à un sous-ensemble des données privées.

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!

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