Heim > Backend-Entwicklung > Golang > Kann Go Generics einen Kanal für verschiedene Laufzeittypen erstellen?

Kann Go Generics einen Kanal für verschiedene Laufzeittypen erstellen?

Mary-Kate Olsen
Freigeben: 2024-12-10 06:46:14
Original
218 Leute haben es durchsucht

Can Go Generics Create a Channel for Diverse Runtime Types?

Go Generic Container für verschiedene Laufzeittypen

Problemstellung:

So erstellen Sie einen Go-Kanal, der jeden Datentyp mithilfe von Generika verarbeiten kann, sodass eine Goroutine Daten verschiedener Typen verarbeiten kann, ohne den Typ anzugeben vorher.

Lösung:

Der vorgeschlagene Ansatz mit Generika ist falsch. Generika erfordern vor der Verwendung eine Instanziierung mit einem bestimmten Typ. Stattdessen sollte für einen Kanal, der jeden Typ verarbeiten kann, ein Kanal vom Typ chan interface{} erstellt werden.

Detaillierte Erklärung:

Generika in Go erlauben die Definition von parametrisierten Typen, beispielsweise ein Kanal, der einen bestimmten Typ enthalten kann. Der Versuch, einen Kanal zu erstellen, der jeden Typ akzeptieren kann, ohne einen konkreten Typ anzugeben (wie in Kanal T), ist jedoch nicht möglich.

Damit ein Kanal zum Senden und Empfangen von Daten verwendet werden kann, muss sein Typ angegeben werden . Zum Beispiel:

type GenericChan[T any] chan T
Nach dem Login kopieren

Um diesen generischen Kanal zu verwenden, muss er mit einem konkreten Typ instanziiert werden:

c := make(GenericChan[int])
Nach dem Login kopieren

Falscher Ansatz bei der Verwendung von Generika:

Der in der Frage bereitgestellte Code versucht, einen generischen Kanal zu erstellen, der jeden Typ enthalten kann, z als:

func StartController[T any](sender chan Packet[T]) {
    go runThread(sender)
}
Nach dem Login kopieren

Dies ist jedoch falsch, da der Kanaltyp undefiniert ist. Das Kompilieren des Codes führt zu:

.\test.go:8:22: cannot use generic type Packet[T interface{}] without instantiation
Nach dem Login kopieren

Korrekter Ansatz unter Verwendung der Chan-Schnittstelle{}:

Anstelle der Verwendung von Generika sollte ein Kanal vom Typ Chan-Schnittstelle{} verwendet werden erstellt:

sender := make(chan interface{})
Nach dem Login kopieren

Dieser Kanal kann Daten jeglicher Art akzeptieren und ist mit verschiedenen Goroutinen kompatibel. Beim Empfang von Daten von diesem Kanal muss der Empfänger die Typzusicherung verwenden, um den tatsächlichen Datentyp zu bestimmen:

data := <-sender
fmt.Println(data.(int)) // Type assertion to retrieve the int value
Nach dem Login kopieren

Alternative unter Verwendung von Generics und Typparametern:

Während a Obwohl ein generischer Kanal, der jeden Typ verarbeiten kann, nicht möglich ist, ist es möglich, generischen Code zu schreiben, der beliebige Typen verwendet und die Typsicherheit aufrechterhält. Dies kann mithilfe von Typparametern erreicht werden:

func receiveAny[T any](c chan T) T {
    return <-c
}
Nach dem Login kopieren

Diese Funktion kann entweder mit einem Chan-Int oder einem Chan-String aufgerufen werden, wobei die Typsicherheit gewahrt bleibt.

Das obige ist der detaillierte Inhalt vonKann Go Generics einen Kanal für verschiedene Laufzeittypen erstellen?. 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