泛型
泛型在 Go 1.18 版本中正式引入,这是语言能力的一大飞跃。通过泛型,你可以编写能处理任何类型的函数和数据结构,同时仍保证类型安全。
package main
import "fmt"
// PrintSlice 打印切片中元素。
func PrintSlice[T any](s []T) {
for _, v := range s {
fmt.Println(v)
}
}
func main() {
intSlice := []int{1, 2, 3, 4, 5}
PrintSlice(intSlice)
stringSlice := []string{"apple", "orange", "banana"}
PrintSlice(stringSlice)
}
PrintSlice
函数使用类型参数 T
进行定义。[T any]
方括号中的 T
表示类型参数,而 any
是类型约束,表示 T
可以是任何类型。
在调用 PrintSlice
时,类型参数是根据传递给函数的参数类型推断出来的。这使开发者能够编写通用代码,适用于不同的类型。
你可以在声明中带有多个类型参数。
package main
import "fmt"
// Map 是使用内置的 map 类型实现的通用映射。
type Map[K comparable, V any] map[K]V
func (m Map[K, V]) Put(key K, value V) {
m[key] = value
}
func (m Map[K, V]) Get(key K) (V, bool) {
value, ok := m[key]
return value, ok
}
func main() {
intStringMap := make(Map[int, string])
intStringMap.Put(1, "one")
intStringMap.Put(2, "two")
intStringMap.Put(3, "three")
value, exists := intStringMap.Get(2)
if exists {
fmt.Println("Key 2 found, Value:", value)
} else {
fmt.Println("Key 2 not found.")
}
stringFloatMap := make(Map[string, float64])
stringFloatMap.Put("pi", 3.14)
stringFloatMap.Put("e", 2.718)
value2, exists := stringFloatMap.Get("pi")
if exists {
fmt.Println("Key 'pi' found, Value:", value2)
} else {
fmt.Println("Key 'pi' not found.")
}
}
代码挑战
使用泛型在 Go 中实现一个通用的栈数据结构。
Loading...
> 此处输出代码运行结果