golang泛型快速入门使用(go 1.18及以后版本)
本文完全来源于官方文档,可放心食用,如果看得懂英文,建议直接参考官方文档(Tutorial: Getting started with generics)
1、上手使用
例如,有 string->int64 和 string->float64 两类 map,我们需要对 map 的 value 求和。
使用泛型前的代码:
// SumInts adds together the values of m.
func SumInts(m map[string]int64) int64 {var s int64for _, v := range m {s += v}return s
}// SumFloats adds together the values of m.
func SumFloats(m map[string]float64) float64 {var s float64for _, v := range m {s += v}return s
}
使用泛型替换上述代码:
// SumIntsOrFloats sums the values of map m. It supports both int64 and float64
// as types for map values.
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V {var s Vfor _, v := range m {s += v}return s
}
代码说明:
- 声明了一个 SumIntsOrFloats 函数,此函数参数类型为 map,返回值类型为 V,函数的作用是对 map 的 int64 或 float64 类型 value 求和。
- map 的 K 和 V 是泛型类型,泛型的约束写在 方括号 [ ] 中,K 具有约束 comparable(即可做 == 或 != 运算,参考 深入理解 Go Comparable Type),V 是 int64 或 float64(也相当于是对入参类型的约束)。
- 该函数的调用方式:
ints := map[string]int64{"a":1,"b":2,
}
floats := map[string]float64{"a":3.0,"b":4.0,
}
fmt.Printf("Generic Sums: %v and %v\n",SumIntsOrFloats[string, int64](ints), SumIntsOrFloats[string, float64](floats))
- 当然,map 的 key 的类型也可以不一样,满足
ints := map[string]int64{"a":1,"b":2,
}
floats := map[int32]float64{5:3.0,6:4.0,
}
fmt.Printf("Generic Sums: %v and %v\n",SumIntsOrFloats[string, int64](ints), SumIntsOrFloats[int32, float64](floats))
即:需要和函数定义一样写明参数类型。
当然,此处参数类型不写也可以(可以省略,但前提是编译器可以从函数参数的类型推断类型参数):
fmt.Printf("Generic Sums, type parameters inferred: %v and %v\n",SumIntsOrFloats(ints),SumIntsOrFloats(floats))
- “编译器可以从函数参数的类型推断类型参数”,不太明白,哪位大佬举个例子或给个反例?
2、关于类型约束
类型约束可以定义为接口,可以简化代码,便于复用:
上述代码可进一步简化为:
type Number interface {int64 | float64
}
// SumNumbers sums the values of map m. It supports both integers
// and floats as map values.
func SumNumbers[K comparable, V Number](m map[K]V) V {var s Vfor _, v := range m {s += v}return s
}fmt.Printf("Generic Sums with Constraint: %v and %v\n",SumNumbers(ints),SumNumbers(floats))
3、完整代码
package mainimport "fmt"func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V {var s Vfor _, v := range m {s += v}return s
}func main() {ints := map[string]int64{"a":1,"b":2,}floats := map[int32]float64{5:3.0,6:4.0,}fmt.Printf("Generic Sums: %v and %v\n",SumIntsOrFloats[string, int64](ints), SumIntsOrFloats[int32, float64](floats))fmt.Printf("Generic Sums: %v and %v\n",SumIntsOrFloats(ints), SumIntsOrFloats(floats))
golang泛型快速入门使用(go 1.18及以后版本)相关推荐
- Golang channel 快速入门
文章目录 1.简介 2.缓冲 channel 3.range 和 close 操作 4.select 操作 5.注意要点 6.常见用法 参考文献 1.简介 channel 提供了一种通信机制,通过发送 ...
- golang beego快速入门示例(单文件hello.go)
安装beego & bee $ go get -u github.com/beego/beego/v2 $ go get -u github.com/beego/bee/v2 hello.go ...
- mybatis学习笔记——mybatis-plus快速入门
一.快速入门 MyBatis-plus (简称mp)是一款 Mybatis 增强工具,用来简化开发.增强效率.本文结合Spring Boot来实现mp的快速入门. 注:本文演示mp版本为当前最新的3. ...
- Easy-RSA 3快速入门自述文件
Easy-RSA 3快速入门自述文件 这是使用Easy-RSA版本3的快速入门指南.运行./easyrsa -h可以找到有关使用和特定命令的详细帮助.可以在doc /目录中找到其他文档. 如果您从Ea ...
- rust放置木箱转向_[易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]...
[易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates] 实用知识 装箱crates 我们今天来讲讲装箱技术crates. 什么是crates? 英语翻译是: 英 [kre ...
- 【Golang 快速入门】高级语法:反射 + 并发
Golang 快速入门 Golang 进阶 反射 变量内置 Pair 结构 reflect 结构体标签 并发知识 基础知识 早期调度器的处理 GMP 模型 调度器的设计策略 并发编程 goroutin ...
- golang快速入门[8.3]-深入理解IEEE754浮点数
前文 golang快速入门[1]-go语言导论 golang快速入门[2.1]-go语言开发环境配置-windows golang快速入门[2.2]-go语言开发环境配置-macOS golang快速 ...
- 【Golang 快速入门】项目实战:即时通信系统
Golang 快速入门 即时通信系统 - 服务端 版本一:构建基础 Server 版本二:用户上线功能 版本三:用户消息广播机制 版本四:用户业务层封装 版本五:在线用户查询 版本六:修改用户名 版本 ...
- golang 模板引擎 html,Golang模板引擎快速入门教程
Go语言内置了 text/template 和 html/template两个模板库,专门用于处理网页html模板. html/template 是在 text/template 模板库的基础上增加了 ...
最新文章
- acm经典题Mark
- C# 3.0/3.5语法新特性示例汇总[转]
- python 实现简单查询页面_python web 实现简易天气查询
- Ajax服务器响应简单实例
- OpenCV腐蚀和膨胀Eroding and Dilating
- [vue] axios是什么?怎样使用它?怎么解决跨域的问题?
- python dict相加_Python合并字典操作时同key的value应该如何相加
- 获得N^2个往返接力数字表格的算法
- 开发者须知:关于 Android L 的一切
- 视频插帧算法之光流法
- Mac电脑 如何在任意目录快速打开终端并定位到当前目录
- 主成分分析法Principal component analysis (PCA)介绍
- 违章查询免费api接口代码
- 基于Gensim创建词向量
- 电脑显示黑屏但是鼠标能动怎么处理?
- 【分享】沪江网提供的每日一句API
- MT6757_MT6763_Brightness_CaseShare
- 华为暂缓校招,解散校招群,冲上热搜,引发应届生强烈不满!
- 刘易远:如何提升自我赋能?
- OpenCV常用函数记载
热门文章
- tar压缩解压文件/文件夹
- 计算机英语第四版刘艺第二单元,计算机英语 刘艺 第4版 第二单元译文
- mysql生成饼状图_ireport 5.6教程之饼图制作过程
- Java基于springboot+vue+elementUI股票交易模拟系统
- 杰理之芯片使用注意事项2【篇】
- Steinberg Cubase 5 v5.1.2 For Windows 中文汉化完整版加精简版
- 自我反思--table的简单数据分页
- Windows安装、配置、卸载MySQL教程
- win7 linux error15,Win7开机黑屏error 15:file not found如何解决?
- SEOer需要了解的十大百度搜索技巧