Heim > Backend-Entwicklung > Golang > Wie kann ich über externe Pakete auf private Strukturfelder in Go zugreifen?

Wie kann ich über externe Pakete auf private Strukturfelder in Go zugreifen?

Linda Hamilton
Freigeben: 2024-12-21 01:59:09
Original
558 Leute haben es durchsucht

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

Zugriff auf private Strukturfelder aus externen Paketen

In Go sollen private Felder einer Struktur außerhalb des Pakets, in dem sie sich befinden, nicht zugänglich sein definiert. Es gibt jedoch Situationen, in denen es erforderlich sein kann, von einem anderen Paket aus auf diese privaten Felder zuzugreifen, beispielsweise zu Testzwecken.

Verwenden von Reflection

Eine Möglichkeit, auf private Felder zuzugreifen Felder aus einem anderen Paket verwenden Reflektion. Bei der Reflexion wird die interne Struktur eines Objekts zur Laufzeit untersucht. Der folgende Codeausschnitt zeigt, wie private Felder mithilfe von Reflection in Go-Versionen vor 1.7 gelesen werden:

import (
    "fmt"
    "reflect"
)

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

Unsafe verwenden

In Go-Versionen 1.7 und höher, Zugriff Private Felder mit Reflektion gelten als unsicher. Alternativ können Sie das unsichere Paket verwenden, um Zugriffsbeschränkungen zu umgehen. Von dieser Methode wird jedoch dringend abgeraten, da sie nicht portierbar ist und zu unerwartetem Verhalten führen kann, wenn sich die Struktur des Objekts ändert.

Der folgende Codeausschnitt zeigt, wie man unsafe verwendet, um auf private Felder zuzugreifen und diese zu ändern:

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
}
Nach dem Login kopieren

Alternativen

Es wird generell empfohlen, den Zugriff auf private Felder von externen Paketen aus zu vermeiden, da dies der Fall ist verstößt gegen das Prinzip der Kapselung. Ziehen Sie stattdessen die folgenden Alternativen in Betracht:

  • Verschieben Sie die Testfunktionalität in dasselbe Paket wie die privaten Felder.
  • Exportieren Sie eine Schnittstelle oder stellen Sie Getter/Setter-Methoden bereit, um externen Zugriff auf eine zu ermöglichen Teilmenge der privaten Daten.

White-Box-Test Überlegungen

Wenn Sie White-Box-Tests durchführen, kann die Verwendung von Reflection oder Unsafe akzeptabel sein, da Sie Zugriff auf den Quellcode haben. In solchen Fällen können Sie ein separates Testpaket erstellen, das Funktionen für den Zugriff auf private Felder definiert. Es ist jedoch wichtig zu beachten, dass diese Tests nicht hermetisch sind und sich unerwartet verhalten können, wenn sich die Struktur des Objekts ändert.

Das obige ist der detaillierte Inhalt vonWie kann ich über externe Pakete auf private Strukturfelder in Go zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage