Heim >Backend-Entwicklung >Golang >Wie erstelle ich mit Generics in Go 1.18 neue Objekte eines bestimmten Typs?
Generics in Go 1.18 Beta bieten eine leistungsstarke Möglichkeit, flexiblen und wiederverwendbaren Code zu erstellen. Eine häufige Aufgabe ist das Erstellen neuer Objekte eines bestimmten Typs. Die Implementierung dieser Funktionalität erfordert jedoch ein gewisses Verständnis der Generics-Syntax.
Der folgende Code definiert eine FruitFactory mit einem generischen Typparameter T. Die Create-Methode versucht zu erstellen eine neue Instanz von T (z. B. *Apple), gibt jedoch derzeit Null zurück, was zum Absturz des Programms führt, wenn auf das Objekt zugegriffen wird Eigenschaften.
type FruitFactory[T any] struct{} func (f FruitFactory[T]) Create() *T { // How to create a non-nil fruit here? return nil } type Apple struct { color string } func example() { appleFactory := FruitFactory[Apple]{} apple := appleFactory.Create() // Panics because nil pointer access apple.color = "red" }
Da Apple ein Nicht-Zeiger-Typ ist, können wir einfach eine Variable vom Typ T deklarieren und ihre Adresse zurückgeben:
func (f FruitFactory[T]) Create() *T { var a T return &a }
Alternativ kann new(T) verwendet werden, um eine neue Instanz zu erstellen und diese zurückzugeben Zeiger:
func (f FruitFactory[T]) Create() *T { return new(T) }
Mit diesen Änderungen gibt die Create-Methode jetzt ein gültiges Objekt vom Typ T zurück, wodurch das Nullzeigerproblem gelöst wird.
Wenn FruitFactory Wird mit einem Zeigertyp instanziiert, ist eine komplexere Lösung erforderlich, um Segmentierungsfehler zu vermeiden. Eine benutzerdefinierte Schnittstelle, Ptr, ist erforderlich, um Zeigertypen im Typparameter einzuschränken:
// Constraining a type to its pointer type type Ptr[T any] interface { *T } // The first type parameter will match pointer types and infer U type FruitFactory[T Ptr[U], U any] struct{} func (f FruitFactory[T,U]) Create() T { // Declare var of non-pointer type. This is not nil! var a U // Address it and convert to pointer type (still not nil) return T(&a) }
Mit diesem Setup wird es möglich, neue Instanzen von Zeigertypen innerhalb der generischen Factory zu erstellen und so Segmentierungsfehler zu verhindern.
Das obige ist der detaillierte Inhalt vonWie erstelle ich mit Generics in Go 1.18 neue Objekte eines bestimmten Typs?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!