» Go语言快速入门 » 2. 进阶篇 » 2.8 泛型

泛型

泛型在 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...
> 此处输出代码运行结果
上页
下页