本文完全来源于官方文档,可放心食用,如果看得懂英文,建议直接参考官方文档(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及以后版本)相关推荐

  1. Golang channel 快速入门

    文章目录 1.简介 2.缓冲 channel 3.range 和 close 操作 4.select 操作 5.注意要点 6.常见用法 参考文献 1.简介 channel 提供了一种通信机制,通过发送 ...

  2. golang beego快速入门示例(单文件hello.go)

    安装beego & bee $ go get -u github.com/beego/beego/v2 $ go get -u github.com/beego/bee/v2 hello.go ...

  3. mybatis学习笔记——mybatis-plus快速入门

    一.快速入门 MyBatis-plus (简称mp)是一款 Mybatis 增强工具,用来简化开发.增强效率.本文结合Spring Boot来实现mp的快速入门. 注:本文演示mp版本为当前最新的3. ...

  4. Easy-RSA 3快速入门自述文件

    Easy-RSA 3快速入门自述文件 这是使用Easy-RSA版本3的快速入门指南.运行./easyrsa -h可以找到有关使用和特定命令的详细帮助.可以在doc /目录中找到其他文档. 如果您从Ea ...

  5. rust放置木箱转向_[易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]...

    [易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates] 实用知识 装箱crates 我们今天来讲讲装箱技术crates. 什么是crates? 英语翻译是: 英 [kre ...

  6. 【Golang 快速入门】高级语法:反射 + 并发

    Golang 快速入门 Golang 进阶 反射 变量内置 Pair 结构 reflect 结构体标签 并发知识 基础知识 早期调度器的处理 GMP 模型 调度器的设计策略 并发编程 goroutin ...

  7. golang快速入门[8.3]-深入理解IEEE754浮点数

    前文 golang快速入门[1]-go语言导论 golang快速入门[2.1]-go语言开发环境配置-windows golang快速入门[2.2]-go语言开发环境配置-macOS golang快速 ...

  8. 【Golang 快速入门】项目实战:即时通信系统

    Golang 快速入门 即时通信系统 - 服务端 版本一:构建基础 Server 版本二:用户上线功能 版本三:用户消息广播机制 版本四:用户业务层封装 版本五:在线用户查询 版本六:修改用户名 版本 ...

  9. golang 模板引擎 html,Golang模板引擎快速入门教程

    Go语言内置了 text/template 和 html/template两个模板库,专门用于处理网页html模板. html/template 是在 text/template 模板库的基础上增加了 ...

最新文章

  1. acm经典题Mark
  2. C# 3.0/3.5语法新特性示例汇总[转]
  3. python 实现简单查询页面_python web 实现简易天气查询
  4. Ajax服务器响应简单实例
  5. OpenCV腐蚀和膨胀Eroding and Dilating
  6. [vue] axios是什么?怎样使用它?怎么解决跨域的问题?
  7. python dict相加_Python合并字典操作时同key的value应该如何相加
  8. 获得N^2个往返接力数字表格的算法
  9. 开发者须知:关于 Android L 的一切
  10. 视频插帧算法之光流法
  11. Mac电脑 如何在任意目录快速打开终端并定位到当前目录
  12. 主成分分析法Principal component analysis (PCA)介绍
  13. 违章查询免费api接口代码
  14. 基于Gensim创建词向量
  15. 电脑显示黑屏但是鼠标能动怎么处理?
  16. 【分享】沪江网提供的每日一句API
  17. MT6757_MT6763_Brightness_CaseShare
  18. 华为暂缓校招,解散校招群,冲上热搜,引发应届生强烈不满!
  19. 刘易远:如何提升自我赋能?
  20. OpenCV常用函数记载

热门文章

  1. tar压缩解压文件/文件夹
  2. 计算机英语第四版刘艺第二单元,计算机英语 刘艺 第4版 第二单元译文
  3. mysql生成饼状图_ireport 5.6教程之饼图制作过程
  4. Java基于springboot+vue+elementUI股票交易模拟系统
  5. 杰理之芯片使用注意事项2【篇】
  6. Steinberg Cubase 5 v5.1.2 For Windows 中文汉化完整版加精简版
  7. 自我反思--table的简单数据分页
  8. Windows安装、配置、卸载MySQL教程
  9. win7 linux error15,Win7开机黑屏error 15:file not found如何解决?
  10. SEOer需要了解的十大百度搜索技巧