首页 > 其他分享 >golang新特性:泛型

golang新特性:泛型

时间:2024-08-27 17:53:40浏览次数:5  
标签:形参 接口 golang 类型 特性 泛型 Go 实参

泛型

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

标签:形参,接口,golang,类型,特性,泛型,Go,实参
From: https://blog.csdn.net/qq_43563282/article/details/141609181

相关文章

  • 【Cesium入门教程】第四篇:Cesium 图元(Primitive)与高级特性
     往期回顾:【Cesium入门教程】第一篇:Cesium简介与快速入门【Cesium入门教程】第二篇:基础操作与地图控制【Cesium入门教程】第三篇:Cesium实体(Entity)与数据源(DataSources)图元(Primitive)的概念在Cesium中,图元(Primitive)是一种用于创建和操作三维几何形状的底层API。C......
  • Zigbee VS DigiMesh 网络特性对照表
     Zigbee协议DigiMesh协议节点类型协调器,路由器和终端设备同质网络,灵活路由可配置性多重角色定义会导致网络配置不太灵活。每个父设备只能支持数量有限的子设备。可更灵活地扩展网络。简化网络设置。无须考虑网络父/子设备比率。或者,您可以禁用相关设备路由消息的......
  • Mysql特性总结
    1.发展史:瑞典几个开发者研发,2000年开源源代码,后面发展为Mysql,再后来更新mariaDB,2.功能比较具备所有数据库管理系统所需要的相关功能。数据存储引擎Innodb PostGreSQL支持四种隔离级别每种数据库管理系统都有自身的优势,也有其自身的限制。产品定位不同。mysql安装包......
  • STL与泛型编程
    1.迭代器种类(1)inputiterator(2)outputiterator(3)forwarditerator(4)bidirectionaliterator(5)randomaccessiterator2.inputiterator信息从容器流入程序被称为输入,input迭代器被用于从容器中读取信息。Input迭代器只读,不能改写容器中的数据。input迭代器支持++操......
  • LaViT:Less-Attention Vision Transformer的特性与优点
    引言https://arxiv.org/pdf/2406.00427随着计算机视觉领域的发展,视觉Transformer(ViTs)逐渐成为一项重要技术。尽管ViTs在捕捉图像中的长距离依赖关系方面表现出色,但其沉重的计算负担和潜在的注意力饱和问题一直是实际应用的障碍。为解决这些问题,微软提出了Less-AttentionV......
  • 【从头写CAD】 转换矩阵类系列一,总说明及泛型类
    /*矩阵类编程思路总说明:平面CAD对象主要包括点(point)、线(line含线段、直线、射线,宽线、多段线)、平面形状(shap含矩形、圆形、椭圆、文字、图块实体、外部参照实体及各种标注等)。我们先用点(point)来说明矩阵功能。点(P),可以用向量(1,x,y)表示。一、如果点发生平移......
  • C++面向对象三大特性之一(继承)
    面向对象思维是编程中很重要的一个思维,众所周知面向对象编程有三大特性封装、继承、多态,今天我就来分享一下三大特性之一的继承。一、什么是继承?我们举例说明,比如你老爸的财产你可以使用,这就是继承,在面向对象中,体现为一个子类可以使用父类的成员属性和成员函数,自己不用在......
  • CSS3新特性
    一、圆角1、border-radius属性(圆角)通过​border-radius​属性可以给任何元素设置​“圆角”​。如果你在​border-radius属性中只指定​一个值​,那么将生成​4个圆角​。但是,如果你要在四个角上​一一指定​,可以使用以下规则:​四个值​: 第一个值为​左上角​,第二个值......
  • golang 标准库(os)
    os标准库实现了平台(操作系统)无关的编程接口。1.创建文件packagemainimport( "fmt" "os")//创建文件funcCreatFile(FileNamestring){ f,err:=os.Create(FileName) iferr!=nil{ fmt.Println("err:",err) }else{ fmt.Printf("创建文件%v成......
  • golang interface{} Type assertions类型断言 x.(T) 和Type switches类型选择 switch
    在golang的开发中,我们经常会用到类型断言typeassertions和switchx.(type)类型选择,他们都可以对interface{}空接口类型的数据进行类型断言,他们的功能类似但是有区别,区别如下:共同点:都可以对interface{} /any类型的数据进行数据类型的断言区别:  类型断言x.(T)......