Heim >Backend-Entwicklung >Golang >Wie kann ich mithilfe von Generics sicher typisierte Objekte eines generischen Typs in Go erstellen?
Typisierte Objekte mit Go-Generika erstellen
In Go 1.18 bieten Generika leistungsstarke Möglichkeiten zur dynamischen Bearbeitung von Typen. Eine häufige Aufgabe besteht darin, neue Objekte eines bestimmten Typs zu erstellen. Betrachten Sie das folgende Beispiel:
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" }
Die FruitFactory versucht, eine neue Instanz eines generischen Typs T zu erstellen. Die Rückgabe von Null führt jedoch zum Absturz des Programms. Lassen Sie uns untersuchen, wie Sie in diesem Szenario neue Objekte erstellen:
Nicht-Zeigerobjekte erstellen
Wenn der Typ T kein Zeigertyp ist, können Sie eine Variable erstellen und Geben Sie die Adresse zurück:
func (f FruitFactory[T]) Create() *T { var a T return &a }
Alternativ können Sie verwenden new(T):
func (f FruitFactory[T]) Create() *T { return new(T) }
Zeigerobjekte erstellen
Zeigerobjekte zu erstellen erfordert mehr Arbeit. Sie können Typinferenz verwenden, um eine Nicht-Zeigervariable zu deklarieren und in einen Zeiger umzuwandeln:
// 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 main() { // Instantiating with pointer type appleFactory := FruitFactory[*Apple, Apple]{} apple := appleFactory.Create() // All good apple.color = "red" fmt.Println(apple) // &{red} }
Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von Generics sicher typisierte Objekte eines generischen Typs in Go erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!