Heim > Backend-Entwicklung > Golang > Wie kann ich für Tests und andere legitime Zwecke auf private Felder in Go zugreifen?

Wie kann ich für Tests und andere legitime Zwecke auf private Felder in Go zugreifen?

Linda Hamilton
Freigeben: 2024-12-19 09:36:10
Original
981 Leute haben es durchsucht

How Can I Access Private Fields in Go for Testing and Other Legitimate Purposes?

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

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

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

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!

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