泛型

泛型,最简单的理解就是:类型作为参数,在结构体或函数中使用。

有了泛型就可以编写出更为简洁,通用,抽象的代码。

V的泛型目前支持五种:

  • 泛型函数

  • 泛型结构体

  • 泛型方法

  • 泛型接口

  • 泛型联合类型

泛型函数

在泛型函数中,所有普通类型能使用的场景,泛型也应该要能使用。

泛型跟普通类型一样可以作为:

  • 函数参数的类型

  • 函数返回值的类型

  • 函数不确定个数参数的类型

  • 函数数组参数的类型

  • 数组的类型

  • 多维数组的类型

  • 固定大小数组的类型

  • 泛型支持类型系统中的:所有基本类型,数组,字典类型,信道chan的类型

  • 甚至泛型函数和泛型结构体也可以组合起来使用

  • 其他各种普通类型能用的场景

泛型函数的调用方式有标准方式简洁方式这两种。

简洁方式只有泛型在函数参数中有使用才可以,编译器会自动根据参数的类型,作为泛型的类型。

让调用泛型函数看起来像是调用普通函数那样,简化泛型函数的调用,让代码看起来更舒服。

泛型结构体

在泛型结构体中,所有普通类型能使用的场景,泛型也应该要能使用。

泛型跟普通类型一样,在结构体中可以作为:

  • 结构体字段的类型

  • 结构体的引用类型&

  • 结构体函数类型字段的参数或返回值

  • 泛型函数的嵌套使用

  • 泛型结构体的嵌套使用

  • 泛型结构体的泛型方法

  • 甚至泛型函数和泛型结构体也可以组合起来使用

  • 其他各种普通类型能用的场景

泛型方法

泛型方法基本跟泛型函数一样,唯一的差别是:如果结构体也是泛型结构体,方法的接收者也都要带上泛型符号。

泛型结构体和泛型方法的泛型类型可以不一样:

泛型方法可以嵌套调用:

除了可以对V结构体定义泛型方法,也可以对C结构体定义泛型方法:

泛型接口

泛型接口的定义跟泛型结构体基本一样。

只有泛型结构体才能实现泛型接口,普通结构体无法实现泛型接口。

泛型联合类型

联合类型也支持泛型的结合使用。

动态判断泛型的具体类型

可以通过使用编译时反射来动态判断泛型的具体类型:

泛型的实现方式

V的泛型实现方式跟rust一样:在编译时,由编译器对泛型函数和泛型结构体进行分析,穷举,把泛型函数所有实际调用到的具体类型转化成具体类型对应的普通函数和普通结构体。

这种实现方式的优点是:性能好,没有运行时开销;

缺点是:如果实际调用到的类型很多,穷举后生成的普通函数和普通结构体也会很多,编译后的可执行文件会变大。

这种取舍在所难免,不过运行快最重要,可执行文件变大,只要不是太夸张还是可以接受的。

V泛型代码:

生成的C代码:

尚未支持的特性

目前V的泛型还没实现:对类型进行where限定,给类型增加条件限定。

最后更新于

这有帮助吗?