Go语言的泛型功能来了!-这样写的代码就可以更通用-Go语言的泛型功能来了

Go语言的泛型功能来了!

什么是泛型?

简单来说,泛型就像是在编程时用占位符代替具体类型,这样写的代码就可以更通用、更灵活。

泛型怎么做?

从1.18版本开始,Go正式支持泛型,主要可以通过以下方式实现:

1. 定义泛型函数

就像这样:

```go func PrintSlice[T any](s []T) { // 打印切片s的内容 } ```

这里,`T`就是一个类型参数,表示可以是任何类型。

2. 定义泛型结构体

例如:

```go type Map[K, V any] struct { m map[K]V } ```

这个结构体可以存储任意类型的键值对。

3. 使用类型约束限定类型参数

为了更安全、更实用,可以给类型参数加一些限制。比如:

```go type Reader[T any] interface { Read(p []T) (n int, err error) } ```

这里,`Reader`接口定义了一组允许的类型。

泛型的优势

优势 描述
代码复用 通过泛型,可以减少重复的代码编写。
类型安全 泛型代码在编译时就可以检查类型,减少运行时错误。
性能优化 泛型函数在编译时会生成针对具体类型的代码,提高性能。

泛型的限制和注意事项

泛型虽然强大,但也有局限性:

实例:实现一个泛型栈

```go type Stack[T any] struct { items []T } func (s Stack[T]) Push(v T) { s.items = append(s.items, v) } func (s Stack[T]) Pop() (T, bool) { l := len(s.items) if l == 0 { var zero T return zero, false } item := s.items[l-1] s.items = s.items[:l-1] return item, true } ```

泛型提高了Go语言的灵活性和复用性,但也要注意其局限性和潜在问题。