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()) }
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 }
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:
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!