golang新特性:泛型

泛型

  • Go的泛型(或者或类型形参)目前可使用在3个地方
    • 泛型类型 - 类型定义中带类型形参的类型
    • 泛型receiver - 泛型类型的receiver
    • 泛型函数 - 带类型形参的函数
  • 为了实现泛型,Go引入了一些新的概念:
    • 类型形参
    • 类型形参列表
    • 类型实参
    • 类型约束
    • 实例化 - 泛型类型不能直接使用,要使用的话必须传入类型实参进行实例化
  • 以下三个典型位置无法自定义泛型(但是可以使用别处定义好的泛型)
    • 匿名结构体
    • 匿名函数
    • 方法
  • Go1.18开始就是依据泛型的引入将接口的定义正式更改为了 类型集(Type set)
  • 接口可以不止书写一行,如果一个接口有多行类型定义,那么取它们之间的 交集
  • 虽然空接口内没有写入任何的类型,但它代表的是所有类型的集合,而非一个 空集
  • 类型约束中指定 空接口 的意思是指定了一个包含所有类型的类型集,并不是类型约束限定了只能使用 空接口 来做类型形参
  • any 就是 interaface{} 的别名(alias),两者 完全等价
  • Go内置了一个叫 comparable 的接口,它代表了 所有可用 != 以及 == 对比的类型
  • Go1.18开始将接口分为了两种类型
    • 基本接口(Basic interface)
      • 接口定义中如果只有方法
      • 定义接口变量并赋值
      • 也代表了一个类型集,所以也可用在类型约束中
    • 一般接口(General interface)
      • 接口内不光只有方法,还有类型
      • 一般接口类型不能用来定义变量,只能用于泛型的类型约束
    • 接口定义中使用类型形参则为是泛型类型,使用 泛型类型也必须传入类型实参实例化
    • 接口定义的种种限制规则
      • 用 | 连接多个类型的时候,类型之间不能有相交的部分(即必须是不交集)
        • 但是相交的类型中是接口的话,则不受这一限制
      • 类型的并集中不能有类型形参
      • 接口不能直接或间接地并入自己
      • 接口的并集成员个数 大于一 的时候不能直接或间接 并入 comparable 接口
      • 带方法的接口 (无论是基本接口还是一般接口),都 不能写入 接口的并集中

你可能感兴趣的:(golang,java,开发语言)