本文將帶你從零開始,理解Go 泛型的概念、語法、使用方式,並配有示例代碼,幫助你快速上手。
文章目錄
- 什麼是泛型?
-
1. 泛型函數
- 示例:一個求長度的泛型函數
-
2. 泛型結構體
- 示例:一個通用的盒子
-
3. 泛型集合(Set)
- 示例:一個通用的集合
-
4. 泛型通道(Channel)
- 示例:一個通用的通道
-
5. 泛型方法
- 示例:一個通用的棧
-
6. 泛型迭代器
- 示例:一個通用的迭代器
-
7. 泛型工廠函數
- 示例:一個通用的對象工廠
-
8. Go 1.24 新特性:泛型類型別名
- 示例:定義泛型類型別名
- 結語
Go 語言自 1.18 版本起支持 泛型(Generics) ,這讓 Go 代碼可以更加通用,減少重複代碼,提高開發效率。Go 1.24 進一步增強了泛型支持,引入了 泛型類型別名,讓代碼更簡潔。
本文將帶你從零開始,理解 Go 泛型的概念、語法、使用方式,並配有示例代碼,幫助你快速上手。
什麼是泛型?
簡單來説,泛型 就是讓我們編寫可以適用於多種數據類型的代碼。換句話説,泛型讓你可以定義一個函數或數據結構,它可以處理任何類型的數據,而不需要事先指定類型。你只需要在使用時決定具體的類型。
1. 泛型函數
泛型函數是泛型最基本的應用。它允許你編寫一個函數,可以接收任何類型的參數並返回相應的結果。
示例:一個求長度的泛型函數
假設你要寫一個求切片長度的函數。沒有泛型時,你可能需要為不同類型的切片寫不同的函數:
func LengthInt(s []int) int {
return len(s)
}
func LengthString(s []string) int {
return len(s)
}
但有了泛型,我們就可以寫一個通用的函數來處理不同類型的切片:
func Length[T any](s []T) int {
return len(s)
}
這裏的 T 是泛型類型,它表示函數 Length 可以接受任何類型的切片。any 表示“任何類型都行”。這樣,你就可以用它來求任意類型切片的長度了:
sliceInt := []int{1, 2, 3, 4, 5}
sliceString := []string{"a", "b", "c"}
fmt.Println(Length(sliceInt)) // 輸出: 5
fmt.Println(Length(sliceString)) // 輸出: 3
2. 泛型結構體
除了函數,結構體 也可以使用泛型。這意味着你可以寫一個通用的數據結構,適應不同類型的數據。
閲讀全文:Go 語言泛型用法詳解 - 阿小信的博客