Type parameter
Hàm trong Go có thể được viết để làm việc với nhiều kiểu dữ liệu khác nhau nhờ type parameter (tham số kiểu — chỗ trống để ta điền kiểu dữ liệu vào sau). Các type parameter của một hàm được đặt trong cặp ngoặc vuông, ngay trước danh sách đối số của hàm.
func Index[T comparable](s []T, x T) int
Khai báo này có nghĩa là s là một slice chứa các phần tử thuộc kiểu T bất kỳ, miễn là kiểu đó thoả mãn type constraint (ràng buộc về kiểu) có sẵn comparable. x cũng là một giá trị thuộc đúng kiểu đó.
comparable là một constraint hữu ích, nó cho phép dùng toán tử == và != trên các giá trị thuộc kiểu đó. Trong ví dụ này, chúng ta dùng nó để so sánh một giá trị với mọi phần tử của slice cho tới khi tìm thấy phần tử khớp. Hàm Index này chạy được với mọi kiểu dữ liệu hỗ trợ phép so sánh.
package main
import "fmt"
// Index returns the index of x in s, or -1 if not found.
func Index[T comparable](s []T, x T) int {
for i, v := range s {
// v and x are type T, which has the comparable
// constraint, so we can use == here.
if v == x {
return i
}
}
return -1
}
func main() {
// Index works on a slice of ints
si := []int{10, 20, 15, -10}
fmt.Println(Index(si, 15))
// Index also works on a slice of strings
ss := []string{"foo", "bar", "baz"}
fmt.Println(Index(ss, "hello"))
}
Chạy thử ví dụ này trong Tour of Go ↗
Kiểu generic
Ngoài hàm generic, Go còn hỗ trợ cả kiểu dữ liệu generic. Một kiểu dữ liệu có thể được tham số hoá bằng một type parameter, điều này rất hữu ích khi bạn hiện thực các cấu trúc dữ liệu tổng quát.
Ví dụ này minh hoạ một khai báo kiểu đơn giản cho danh sách liên kết đơn, chứa được giá trị thuộc kiểu bất kỳ.
Coi như bài tập, hãy bổ sung thêm vài tính năng cho phần hiện thực danh sách này.
package main
// List represents a singly-linked list that holds
// values of any type.
type List[T any] struct {
next *List[T]
val T
}
func main() {
}
Chạy thử ví dụ này trong Tour of Go ↗
Chúc mừng!
Bạn đã hoàn thành bài học này!
Bạn có thể quay lại danh sách các mô-đun để tìm nội dung học tiếp theo, hoặc đi tiếp tới bài học kế tiếp.