Golang 中的泛型
Golang,也稱為 Go,是一種流行的開源程式語言,以其簡潔性和併發性而聞名。然而,它缺少其他現代程式語言具有的一個重要特性,那就是泛型。泛型允許程式設計師編寫靈活、可重用的程式碼,這些程式碼可以在不犧牲型別安全性的情況下與不同的型別一起工作。在本文中,我們將探討 Golang 中泛型的介紹、語法和示例。
Golang 中泛型的介紹
泛型是一種編寫可以處理任何型別程式碼的方式,而不是侷限於特定型別。換句話說,泛型允許您編寫可以在不同型別上操作的函式或資料結構,從而使其更加靈活和可重用。
在 Go 1.18 之前,Golang 不支援泛型。但是,隨著 Go 1.18 的釋出,Golang 最終添加了對泛型的支援。這在 Golang 開發人員中一直是一個備受期待的功能,它使 Golang 更加接近已經擁有泛型的現代程式語言,例如 Java 和 C#。
Golang 中泛型的語法
Golang 中泛型的語法使用一個新的關鍵字 type,用於定義泛型型別引數。以下是一個示例 -
func swap[T any](x, y T) (T, T) {
return y, x
}
在這個例子中,T 是型別引數,它使用 any 關鍵字定義。swap 函式接受兩個引數 x 和 y,這兩個引數都是 T 型別,並返回一個 T 型別值的元組。
any 關鍵字用於指定任何型別都可以用作型別引數。但是,您也可以使用約束將型別引數限制為特定的一組型別。以下是一個示例 -
示例
package main
import "fmt"
func find[T comparable](arr []T, val T) int {
for i, v := range arr {
if v == val {
return i
}
}
return -1
}
func main() {
arr := []int{1, 2, 3, 4, 5}
index := find(arr, 3)
fmt.Println(index) // Output: 2
arr2 := []string{"foo", "bar", "baz"}
index2 := find(arr2, "bar")
fmt.Println(index2) // Output: 1
}
輸出
2 1
在這個例子中,T 是型別引數,它被限制為可比較的型別。find 函式接受一個 []T 型別的陣列和一個 T 型別的值,並返回 val 在陣列中第一次出現的索引,如果未找到 val 則返回 -1。
Golang 中泛型的示例
讓我們看一些如何在 Golang 中使用泛型的示例。
示例 1:交換函式
package main
import "fmt"
func swap[T any](x, y T) (T, T) {
return y, x
}
func main() {
a, b := 1, 2
a, b = swap(a, b)
fmt.Println(a, b) // Output: 2 1
c, d := "hello", "world"
c, d = swap(c, d)
fmt.Println(c, d) // Output: world hello
}
輸出
2 1 world hello
示例 2:查詢函式
package main
import "fmt"
func find[T comparable](arr []T, val T) int {
for i, v := range arr {
if v == val {
return i
}
}
return -1
}
func main() {
arr := []int{1, 2, 3, 4, 5}
index := find(arr, 3)
fmt.Println(index) // Output: 2
arr2 := []string{"foo", "bar", "baz"}
index2 := find(arr2, "bar")
fmt.Println(index2) // Output: 1
}
輸出
2 1
在這個例子中,我們使用泛型定義了 find 函式。find 函式接受一個 []T 型別的陣列和一個 T 型別的值,並返回 val 在陣列中第一次出現的索引,如果未找到 val 則返回 -1。我們用不同的型別 int 和 string 呼叫 find 函式兩次,它按預期工作,返回我們正在查詢的值的索引。
結論
泛型是一個強大的特性,允許您在 Golang 中編寫靈活且可重用的程式碼。隨著 Go 1.18 中添加了泛型,Golang 在與其他已經擁有泛型的現代程式語言(如 Java 和 C#)的競爭中變得更加強大。泛型是您工具箱中的一款很棒的工具,您應該考慮在 Golang 專案中使用它們。
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP