为什么要用泛型

go 1.18 前的版本中,如果对传入参数的值不确定时,就要使用空接口的方法传参,然后通过对参数进行断言的方式,取出原结构体。

对泛型切片进行遍历

func printSlice[T any](s []T) {
for i := 0; i < len(s); i++ {
fmt.Println(s[i])
}
} func main() {
printSlice[int]([]int{5, 23, 67, 99, 167})
printSlice([]int{5, 23, 67, 99, 167}) // 也可以省略参数的形势
printSlice([]string{"aaa", "bbb", "ccc", "ddd", "eee"}) // 也可以省略参数的形势
}

声明一个泛型切片

type vector[T any] []T //声明泛型切片

func printSlice[T any](s []T) {
for i := 0; i < len(s); i++ {
fmt.Println(s[i])
}
} func main() {
v1 := vector[int]{58, 1881}
printSlice(v1)
v2 := vector[string]{"烤鸡", "烤鸭", "烤鱼"}
printSlice(v2)
}

使用 interface 来约束泛型参数

type Num interface {
~int | ~int8 | ~int32 | ~int64
} type Str interface {
string
} type NumStr interface {
Num | Str
} func add[T NumStr](a, b T) T {
return a + b
} func main() {
fmt.Println(add(8, 3)) //都是数值,便对两数值相加
fmt.Println(add("aaa", "bbb")) //如果都是字符串,就对字符串拼接
fmt.Println(add(2, "aa")) //一个是字符串,一个是数值 ~ 报错
}

使用方法来约束

type price int

type showPrice interface {
String() string
} func (i price) String() string {
return strconv.Itoa(int(i))
} func ShowPriceList[T showPrice](s []T) (ret []string) {
for _, v := range s {
ret = append(ret, v.String()) //如果传入的类型,没有 string 方法,就会报错
}
return
}
func main() {
fmt.Println(ShowPriceList([]price{1, 2}))
}

最新文章

  1. Kafka 文档引言
  2. 脏检查and刷新机构
  3. 一名Delphi程序员的开发习惯
  4. 从零开始学习Node.js例子五 服务器监听
  5. 【Android】键盘的展开和收起
  6. velocity基础教程--1.标准使用(zhuan)
  7. Ubuntu 修改IP地址网关
  8. PHP中的cookie
  9. 配置ORACLE 客户端连接到数据库
  10. 【DOM】2.闭包
  11. Java向PostgreSQL发送prepared statement 与 libpq 向PostgreSQL发送prepared statement之比较:
  12. kettle不能正常自动获取字段
  13. Qt入门(12)——Qt国际化
  14. java学习第一阶段——面向对象
  15. 3月23日html(五) 格式与布局练习:360浏览器布局
  16. 转Delphi中Memo显示行号列号
  17. LeetCode OJ 41. First Missing Positive
  18. Time complexity of ArrayList in Java
  19. docker-compose部署mysql无法访问
  20. 使用java输出helloworld

热门文章

  1. vim之YouCompleteMe插件问题:The ycmd server SHUT DOWN (restart with ...low the instructions in the documen
  2. java基础(数组、面向抽象编程、static、异常)
  3. Spring框架-IoC核心
  4. CentOS7一键安装RPM版LNMP(NGINX+PHP+MySQL)环境
  5. honoka和格点三角形
  6. LeetCode-798 得分最高的最小论调 及差分和前缀和的学习
  7. 【故障公告】Kubernetes 集群节点宕机造成博客站点故障
  8. 开源持续测试平台--MerterSphere
  9. JMeter 常用的几种断言方法
  10. 阿里云服务器ECS(Centos8)下安装和配置python3.8