Heim > Backend-Entwicklung > Golang > Wie kann ich in Go Across-Paketen auf private Strukturfelder zugreifen?

Wie kann ich in Go Across-Paketen auf private Strukturfelder zugreifen?

Patricia Arquette
Freigeben: 2024-12-22 04:26:11
Original
162 Leute haben es durchsucht

How Can I Access Private Struct Fields in Go Across Packages?

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

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

Alternative Ansätze

Um die Kapselung aufrechtzuerhalten und gleichzeitig White-Box-Tests zu erleichtern, ziehen Sie diese Alternativen in Betracht:

  • Eine dedizierte Methode verfügbar machen: Eine Methode im Originalpaket exportieren, die kontrollierten Zugriff auf die bietet private Felder.
  • Verwenden Sie einen eingebetteten Typ: Erstellen Sie einen eingebetteten Typ innerhalb des Pakets, in dem Zugriff auf private Felder erforderlich ist, und exportieren Sie diesen eingebetteten Typ.

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!

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