Heim > Backend-Entwicklung > Golang > Wie erstelle ich mit Generics in Go 1.18 neue Objekte eines bestimmten Typs?

Wie erstelle ich mit Generics in Go 1.18 neue Objekte eines bestimmten Typs?

Patricia Arquette
Freigeben: 2024-12-12 17:03:09
Original
310 Leute haben es durchsucht

How to Create New Objects of a Specific Type Using Generics in Go 1.18?

Erstellen neuer Objekte mit Generics in Go 1.18

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.

Problem: Erstellen von Objekten über Generics

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"
}
Nach dem Login kopieren

Lösung: Eine Variable initialisieren und zurückgeben

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
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

Mit diesen Änderungen gibt die Create-Methode jetzt ein gültiges Objekt vom Typ T zurück, wodurch das Nullzeigerproblem gelöst wird.

Verarbeitung von Zeigertypen

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)
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage