Heim >Backend-Entwicklung >Golang >Wie erstelle ich ein Nicht-Null-Objekt eines typisierten Werts in Go 1.18 Generics?
Bei der Arbeit mit Generics in Go 1.18 kann es vorkommen, dass Sie ein Objekt erstellen müssen neue Instanz eines benutzerdefinierten Typs innerhalb einer generischen Funktion. Das folgende Problem veranschaulicht diese Herausforderung:
Im bereitgestellten Codebeispiel soll die Create-Funktion in der FruitFactory-Struktur eine neue Instanz vom Typ T erstellen, gibt jedoch derzeit Null zurück. Dies führt zu einem Segmentierungsfehler, wenn versucht wird, auf Attribute des Objekts zuzugreifen.
type FruitFactory[T any] struct{} func (f FruitFactory[T]) Create() *T { // How to create 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" }
Um das Problem zu beheben, müssen wir die Create-Funktion ändern, um eine gültige Instanz des Typs zurückzugeben T. Es gibt zwei Ansätze, um dies zu erreichen:
Ansatz 1 (Nicht-Zeiger). Typen)
Wenn der benutzerdefinierte Typ kein Zeigertyp ist (wie die Apple-Struktur), können Sie eine typisierte Variable deklarieren und ihre Adresse zurückgeben:
func (f FruitFactory[T]) Create() *T { var a T return &a }
Ansatz 2 (Zeigertypen)
Wenn der benutzerdefinierte Typ ein Zeigertyp ist (wie *Apple), ist die Lösung komplexer. Sie können die Leistungsfähigkeit der Typinferenz nutzen, um den Typ der Factory auf Zeigertypen zu beschränken:
// Constraining a type to its pointer type type Ptr[T any] interface { *T } // The first type param 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) } type Apple struct { color string } func example() { // Instantiating with ptr type appleFactory := FruitFactory[*Apple, Apple]{} apple := appleFactory.Create() // All good apple.color = "red" fmt.Println(apple) // &{red} }
Hinweis: Für Ansatz 2 wurde die Typinferenz in Go 1.18 deaktiviert Sie müssen alle Typparameter manuell angeben, wie zum Beispiel: FruitFactory[*Apple, Apple]{}.
Mit diesen Änderungen wird die Create-Funktion gibt eine gültige Instanz vom Typ T (oder *T) zurück, sodass Sie auf seine Attribute zugreifen können, ohne Segmentierungsfehler zu verursachen.
Das obige ist der detaillierte Inhalt vonWie erstelle ich ein Nicht-Null-Objekt eines typisierten Werts in Go 1.18 Generics?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!