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
Patricia ArquetteOriginal
2024-12-22 04:26:11225Durchsuche

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

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:

  • 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!

Stellungnahme:
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