首页 > 其他分享 >Golang 泛型使用

Golang 泛型使用

时间:2022-10-11 01:44:05浏览次数:69  
标签:int16 数据类型 Golang interface 使用 泛型 type int8

Golang 泛型

泛型函数

定义

func Func1[T int | int32 | int64 | float32 | float64](a, b T) T {
	return a + b
}

使用

Func1[int32](1, 2)

但是这样好像看起来很丑,所以可以使用自动类型推导,也就是让 Golang 自己去判断泛型参数(方括号中的类型)究竟是什么,所以调用方式就可以像下面这样

Func1(1, 2)

泛型 map

定义

type Map1[K int | float32, V string] map[K]V

⚠️:K,V 并不是一定要同时定义,比如上例就可以直接定义成

type Map1[K int | float32] map[K]string

⚠️:K,V 没有顺序关系,只是泛型的约束,只是一个代称(叫其他名字也OK)。也就是说 K 不一定非得做“键”,V 不一定非得做“值”,也就是说,上例写成下面这样也没有问题,只是约束对象发生了交换。

type Map1[K int | float32, V string] map[V]K

等价于

type MapInt map[int]string
type MapFloat32 map[float32]string

实例化

var m Map1[int, string] = make(Map1[int, string])

泛型 slice

定义

type Slice1[T int | int32] []T

等价于

type SliceInt []int
type SliceInt32 []int32

实例化

// 等价于 var arr SliceInt 或 var arr []int
var arr Slice1[int]

泛型 struct

定义

type Struct1[T float32 | float64] struct {
	X T
	Y T
}

等价于

type StructFloat32 struct {
	X float32
	Y float32
}

type StructFloat64 struct {
	X float64
	Y float64
}

使用

var p Struct1[float32]

⚠️

  1. 虽然在上述提到的个例当中,除了泛型的 map 其他都只使用了一个泛型参数,但实际上 struct 和泛型函数都可以使用多个泛型参数,与 泛型 map 使用方式相同
  2. 泛型变量被声明之后其使用方法与直接将其定义为指定数据类型是相同的——你可以认为泛型是一个盒子,盒子里面可能装着 int32 和 int64 两种数据类型中任何一种。在你声明某个泛型变量之前永远不知道盒子中的具体数据类型,此时盒子处于两种数据类型的叠加状态,既此时盒子里面的数据类型既是 int32 又是 int64(我不是说 int 在不同平台上的表现)。但是你一旦声明了某个泛型的变量,盒子中的数据类型就由原本的类型叠加态坍缩为单一的某个数据类型,既盒子中只可能是 int32 或 int64
  3. 匿名结构体不支持使用泛型
  4. 泛型类型可以相互嵌套,你可以在一个泛型 struct 中使用一个泛型 slice,但是需要显式声明泛型 slice 的数据类型(也就是说这么搞意义不大,不如直接定义两个泛型参数)。

泛型约束

泛型约束指的的约束泛型泛型能接受的数据类型,更直白的说就是这个 T 可以指代的数据类型。关于泛型约束我们上面提及了一部分,那就是如何使用——在定义的时候在方括号内指定。但是我们先看下面的一个

标签:int16,数据类型,Golang,interface,使用,泛型,type,int8
From: https://www.cnblogs.com/ltozvxe/p/16777942.html

相关文章

  • Jupyter 安装使用
     Jupyter的官网:​​http://jupyter.org/index.html​​官方文档:​​https://jupyter-notebook.readthedocs.io/en/stable/​​​​https://github.com/jupyter/jupyter/wik......
  • k8s--service 之 HeadLiness、NodePort 使用
    前戏环境还是使用我们上节的环境:https://www.cnblogs.com/zouzou-busy/p/16156384.htmlHeadLiness在某些场景中,开发人员可能不想使用Service提供的负载均衡功能,而希望......
  • Ceph使用---CephFS
    一、CephFS介绍cephFS即cephfilesystem,可以实现文件系统共享功能(POSIX标准),客户端通过ceph协议挂载并使用ceph集群作为数据存储服务器,http://docs.ceph.org.......
  • pycharm基础使用
    插件OneDarkThemeTranslation设置主题设置字体设置控制台字体......
  • 文章添加页(富文本编辑器的使用)
    1.文章添加页url开设2.添加文章页面已经富文本编辑器的使用富文本编辑器kindeditor只要到官网下载下来,放入static文件夹就行,如何在html的script处添加对应固定代码{%......
  • [IOS]如何结合XCODE使用git以及异常处理
    1.控制台cd到项目目录下,输入命令:gitinit 2.在gitserver创建xxx/project_name.git,输入命令:git--bareinit 3.本地控制台:gitadd.gitcommit-m"firstCommit"git......
  • 使用 Ant-Design-Vue 制作一个带图片上传功能的表单对话框
    功能需求使用Antdv的Modal组件内嵌一个a-form表单,具有添加数据和图片的功能。页面结构设计<template><!--Modal--><a-modal><div><a-form>......
  • 如何使用vuforiaSDK开发第一个AR demo应用
    1.IfyouareusingorplanningtousetheAndroidStudioIDE,herearesomenotesabouthowtoimportandbuildtheVuforiasamples:首先安装好环境:JDK,NDK,AndroidS......
  • 模板templates的使用
    目录​​模板及其渲染​​​​模板查找路径​​​​DTL模板语法​​​​常用的模板标签​​​​DTL常用过滤器​​​​模块结构优化​​​​加载静态文件​​模板及其渲染视......
  • 《关于如何免费下载使用office365》
    本教程可能不是安装Office唯一的方法,却是应用最广泛,错误率最低的安装方法。如果您在安装过程中遇到了任何错误,请自行检查配置是否出错。如果是因为系统问题:比如是某风的......