Zugriff auf private Felder in Go: Lösungen für Friend-Pakete und White-Box-Tests
In Go sind Strukturfelder normalerweise standardmäßig privat. Sie werden vor dem Zugriff externer Pakete geschützt. Es kann jedoch Szenarien geben, in denen Sie für White-Box-Tests oder aus anderen legitimen Gründen auf private Felder aus einem anderen Paket zugreifen müssen.
Methode 1: Verwenden von Reflection (Go-Versionen vor 1.7)
Vor Go 1.7 bot das Reflect-Paket eine Möglichkeit, mithilfe von Reflection auf nicht exportierte Felder zuzugreifen und diese zu ändern. Der folgende Code zeigt, wie private Felder mithilfe von Reflect geändert werden:
func read_foo(f *Foo) { v := reflect.ValueOf(*f) y := v.FieldByName("y") fmt.Println(y.Interface()) }
Das Ändern nicht exportierter Felder mithilfe von Reflection löst jedoch in Go-Versionen 1.7 und höher eine Panik aus.
Methode 2 : Zeigermanipulation (Go-Versionen 1.7 und höher)
In Go 1.7 und höher, Das Reflect-Paket wurde aktualisiert, um das Ändern nicht exportierter Felder aus anderen Paketen nicht zuzulassen. Es gibt jedoch einen riskanten Ansatz, bei dem der Zeiger mithilfe des unsicheren Pakets manipuliert wird:
func change_foo(f *Foo) { ptrTof := unsafe.Pointer(f) ptrTof = unsafe.Pointer(uintptr(ptrTof) + uintptr(8)) ptrToy := (**Foo)(ptrTof) *ptrToy = nil }
Achtung: Von der Verwendung von unsicher für diesen Zweck wird dringend abgeraten. Es ist nicht portierbar, kann bei Änderungen an Datenstrukturen kaputt gehen und die Speicherbereinigung beeinträchtigen.
White-Box-Testing
Für White-Box-Tests, wo Wenn Sie Zugriff auf private Felder innerhalb eines Pakets benötigen, können Sie die Namenskonvention _test.go verwenden. Alle Dateien mit _test.go am Ende werden nur kompiliert, wenn Tests ausgeführt werden. Dies ermöglicht Ihnen den Zugriff auf private Felder für White-Box-Tests, während sie für den Produktionscode privat bleiben.
// mypackage/foo_test.go package mypackage import ( "testing" ) func TestFoo(t *testing.T) { f := new(Foo) // Access and modify private fields within Foo }
Fazit
Der Zugriff auf private Felder aus einem anderen Paket sollte möglich sein Dies geschieht mit Vorsicht und nur aus legitimen Gründen. Methoden wie Reflektion oder unsichere Zeigermanipulation können zwar Workarounds bieten, sind jedoch mit erheblichen Risiken und Nachteilen verbunden. Für White-Box-Tests bietet die Namenskonvention _test.go einen sichereren und bequemeren Ansatz für den Zugriff auf private Felder innerhalb eines Pakets.
Das obige ist der detaillierte Inhalt vonWie kann ich für Tests und andere legitime Zwecke auf private Felder in Go zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!