【Golang】泛型

31 阅读2分钟

推荐博客

Go 1.18 泛型全面讲解:一篇讲清泛型的全部

The Go Programming Language Specification

Go 1.18官方文档

总结

  1. 为什么要用泛型?不用为不同类型重复写一套相同逻辑代码。

  2. 概念:

    1. 类型形参、类型约束、类型形参列表

      这些用来定义「泛型类型」。

      所有类型定义(如:函数、接口等)都可以使用类型形参。

      类型形参不能使用类型断言和type switch

    2. 泛型类型、泛型类型实例化、类型实参

      使用泛型类型时需要传递类型实参,这就是「泛型类型实例化」

    3. 泛型接收器

    4. 泛型函数

      目前Go的方法并不支持泛型

  3. 接口相关概念的变更:

    1. 接口定义的变更:从「方法集」到「类型集」

      Go 1.18之前:An interface type specifies a method set called its interface

      Go 1.18之后:An interface type defines a type set。

      特殊的类型集——空接口 interface{} 。因为Go1.18开始接口的定义发生了改变,所以 interface{} 的定义也发生了一些变更:「空接口代表了所有类型的集合」。

    2. 接口实现定义的变更:

      当满足以下条件时,我们可以说 类型 T 实现了接口 I ( type T implements interface I)

      • T 不是接口时:类型 T 是接口 I 代表的类型集中的一个成员 (T is an element of the type set of I)
      • T 是接口时: T 接口代表的类型集是 I 代表的类型集的子集(Type set of T is a subset of the type set of I)
    3. 接口分为两种类型:

      也有叫「运行时接口」和「编译时接口」的,如:Go 1.18 新特性

      1. 基本接口:接口定义中只有方法,即方法集,和Go 1.18之前的接口一样。

      2. 一般接口:接口内不光只有方法,还有类型。

        一般接口类型」不能用来定义变量, 只能用于泛型的类型约束中

  4. comparable(可比较) 和 可排序(ordered)接口

    comparable接口,代表了所有可进行「!=」和「==」比较的类型。

    ordered接口,代表了所有可进行大小比较的类型。