Paketübergreifender Zugriff auf private Strukturfelder
In Go ist es üblich, Daten mithilfe privater Strukturfelder zu kapseln, um das Ausblenden von Daten zu erzwingen. Es kann jedoch Situationen geben, in denen es erforderlich ist, von einem anderen Paket aus auf diese privaten Felder zuzugreifen, beispielsweise für White-Box-Testzwecke.
Reflect-Based Approach (Go < 1.7)
Mithilfe von Reflection ist es möglich, private Strukturfelder in Go-Versionen vor 1.7 zu lesen. Hier ist ein Beispiel:
import ( "fmt" "reflect" "github.com/other-package/foo" ) func readFoo(f *foo.Foo) { v := reflect.ValueOf(*f) y := v.FieldByName("y") fmt.Println(y.Interface()) }
Dieser Ansatz ermöglicht es Ihnen, private Felder zu lesen, aber Versuche, sie zu ändern, führen zu einer Panik.
Unsicherer Ansatz (Go ≥ 1.7)
In Go 1.7 und höher kann ein direkterer Ansatz mithilfe des unsicheren Pakets sowohl zum Lesen als auch zum Ändern verwendet werden private Strukturfelder. Von dieser Methode wird jedoch abgeraten, da sie auf der Manipulation von Zeigern auf niedriger Ebene beruht und leicht zu Speicherbeschädigungen und anderen Problemen führen kann. Hier ist ein Beispiel:
import ( "unsafe" "github.com/other-package/foo" ) func changeFoo(f *foo.Foo) { ptrTof := unsafe.Pointer(f) ptrTof = unsafe.Pointer(uintptr(ptrTof) + unsafe.Sizeof(foo.Foo{}.x)) ptrToy := (**foo.Foo)(ptrTof) *ptrToy = nil }
Alternative Ansätze
Um die Kapselung aufrechtzuerhalten und gleichzeitig White-Box-Tests zu erleichtern, ziehen Sie diese Alternativen in Betracht:
Das obige ist der detaillierte Inhalt vonWie kann ich in Go Across-Paketen auf private Strukturfelder zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!