Heim > Backend-Entwicklung > Golang > Die Definition und Anwendung von Golang-Generika

Die Definition und Anwendung von Golang-Generika

王林
Freigeben: 2024-04-04 10:18:02
Original
1060 Leute haben es durchsucht

Generika wurden in Go 1.18 eingeführt, um typunabhängigen Code zu erstellen. Generics verwenden eckige Klammern [], um Typparameter zu definieren, z. B. func Sort[T any](arr []T). Der Go-Compiler kann Typparameter wie func Swap[T](x, y T) ableiten. Generische Elemente können verwendet werden, um Datenstrukturen zu erstellen, z. B. einen binären Suchbaum vom Typ Node[T any] struct { … }, und um Typeinschränkungen festzulegen, z. B. den Typ Node[T vergleichbar] struct { … }. Go-Generika erhöhen die Codeflexibilität, ohne neue Typen zu erstellen.

Die Definition und Anwendung von Golang-Generika

Die Definition und Anwendung von Go-Generika

In Go 1.18 führt die Go-Sprache eine mit Spannung erwartete Funktion ein: Generika. Mit Generika können Sie Datenstrukturen und Algorithmen erstellen, die unabhängig von bestimmten Typen sind, wodurch Ihr Code wiederverwendbar und flexibler wird.

Generika definieren

Generika werden mit eckigen Klammern [] definiert, die eine beliebige Anzahl von Typparametern enthalten: [] 来定义,其中包含任意数量的类型参数:

func Sort[T any](arr []T)
Nach dem Login kopieren

在上面的示例中,T 是类型参数,代表可以是任何类型的项。

类型推断

如果函数的泛型类型参数可以在上下文中推断出来,则可以省略它们:

func Swap[T](x, y T)
Nach dem Login kopieren

此函数可以与任何类型的两个参数一起使用,Go 编译器会推断出 T 应该是 xy 的类型。

实战案例:二叉查找树

让我们创建一个二叉查找树的泛型版本:

type Node[T any] struct {
    Value    T
    Left     *Node[T]
    Right    *Node[T]
}

func Insert[T comparable](n *Node[T], value T) *Node[T] {
    // ...
}

func Search[T comparable](n *Node[T], value T) *Node[T] {
    // ...
}
Nach dem Login kopieren

这个二叉查找树允许我们存储和搜索任何可比较类型的元素。

类型约束

有时,您需要对类型参数施加约束。例如,为了确保在二叉查找树中比较两个值是有效的,我们可以要求 T 实现了 comparable

type Node[T comparable] struct {
    // ...
}
Nach dem Login kopieren
Im obigen Beispiel stellt T Typparameter dar Gegenstände jeglicher Art.

Typinferenz
  • Die generischen Typparameter der Funktion können weggelassen werden, wenn sie aus dem Kontext abgeleitet werden können:
  • rrreee
  • Diese Funktion kann mit zwei Parametern eines beliebigen Typs verwendet werden, der Go-Compiler leitet Tab > sollte vom Typ x und y sein.
  • Praktisches Beispiel: Binärer Suchbaum
Lassen Sie uns eine generische Version eines binären Suchbaums erstellen:

rrreee

Dieser binäre Suchbaum ermöglicht es uns, Elemente jedes vergleichbaren Typs zu speichern und zu durchsuchen.

Typeinschränkungen🎜🎜Manchmal müssen Sie Einschränkungen für Typparameter festlegen. Um beispielsweise sicherzustellen, dass der Vergleich zweier Werte in einem binären Suchbaum gültig ist, können wir verlangen, dass T die comparable-Schnittstelle implementiert: 🎜rrreee🎜Notes🎜🎜🎜 Go Generics sind keine Typvorlagen, sie erstellen keine neuen Typen. 🎜🎜Generische Typparameter können nicht instanziiert werden. 🎜🎜Typinferenz gilt nur beim Aufrufen einer Funktion, nicht bei deren Deklaration. 🎜🎜🎜Fazit🎜🎜Go-Generika bringen leistungsstarke neue Funktionen in die Go-Sprache. Um Ihren Code flexibler und wiederverwendbar zu machen, ist es wichtig zu verstehen, wie man Generika definiert und verwendet. 🎜

Das obige ist der detaillierte Inhalt vonDie Definition und Anwendung von Golang-Generika. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage