In Go werden Schnittstellen normalerweise zum Definieren von Funktionalität und nicht von Daten verwendet. Das bedeutet, dass Sie zwar Methoden in einer Schnittstelle angeben können, aber keine erforderlichen Felder in den Implementierungen angeben können.
Mit eingebetteten Strukturen ist es jedoch möglich, Schnittstellen zu erstellen, die Daten effektiv definieren, indem sie sie über Methoden verfügbar machen.
Betrachten Sie das folgende Beispiel:
type PersonProvider interface { GetPerson() *Person } type Person struct { Name string Age int64 } func (p *Person) GetPerson() *Person { return p } type Bob struct { FavoriteNumber int64 Person }
In diesem Beispiel ist das Die PersonProvider-Schnittstelle definiert eine Methode, die einen Zeiger auf ein Person-Objekt zurückgibt. Die Personenstruktur enthält die Datenfelder Name und Alter. Die Bob-Struktur bettet die Person-Struktur ein und erbt effektiv deren Felder.
Funktionen können mit den eingebetteten Daten über die GetPerson()-Methode interagieren:
func SayHi(pp PersonProvider) { fmt.Printf("Hello, %v!\r", pp.GetPerson().Name) } func main() { b := &Bob{ 5, Person{"Bob", 23}, } SayHi(b) fmt.Printf("You're %v years old now!", b.Age) }
Diese Technik ermöglicht Schnittstellen, die Daten statt Verhalten definieren. Es bietet erhöhte Flexibilität, indem es Strukturen ermöglicht, Schnittstellen zu implementieren, ohne ihre konkreten Felder offenzulegen. Es ist jedoch wichtig zu beachten, dass das Offenlegen von Zeigern immer noch direkten Zugriff auf die Daten gewährt, was eine begrenzte zusätzliche Flexibilität bietet.
Außerdem erfordern Go-Konventionen nicht immer die Verwendung von Abstraktionen für den Datenzugriff. In vielen Fällen ist die Offenlegung von Datenattributen durch Einbettung oder öffentliche Felder akzeptabel. Wenn Sie diese Technik in Betracht ziehen, wird empfohlen, im Einzelfall zu beurteilen, ob sie erhebliche Vorteile gegenüber der direkten Offenlegung von Attributen bietet. Wenn das Offenlegen von Daten durch Getter und Setter für zukünftige Flexibilität oder API-Kompatibilität nicht entscheidend ist, könnten öffentliche Attribute eine einfachere Lösung sein.
Obwohl die vorgestellte Technik insgesamt ein cleverer Trick ist, ist es ratsam, die Notwendigkeit dafür abzuwägen Gehen Sie sorgfältig vor und prüfen Sie alternative Ansätze, die in manchen Kontexten möglicherweise angemessener sind.
Das obige ist der detaillierte Inhalt vonSollten Sie eingebettete Strukturen verwenden, um Daten in Go-Schnittstellen zu definieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!