go1.8-泛型
基本思想:
Parametric Polymorphism(形式)参数多态
基本语法
package main
import "fmt"
func printSlice[T any](s []T){
for _,v:=range s{
fmt.Printf("%v",v)
}
fmt.Print("\n")
}
func main() {
printSlice[int]([]int{66,77,88,99,100})
printSlice[float64]([]float64{1.1,2.2,3.3,4.4,5.5})
printSlice[string]([]string{"红烧肉","清蒸鱼","大闸蟹","九转大肠","重烧海参"})
printSlice([]int64{55,44,33,22,11})
}
- go run -gcflags=-G=3 path/main.go
- [T any]
参数的类型,该函数支持任何T类型
在调用这个泛型函数的时候,可以显示指定类型参数,也可省略
泛型切片声明切片类型
带有类型参数的类型被叫做泛型类型。下面定义一个底层类型为切片类型的新类型vector.它可以存储任何类型的切片。要使用泛型类型,要先对其进行实例化,就是给类型参数指定一个实参
package main
import "fmt"
type vector[T any] []T
func printSlice[T any](s []T){
for _,v:=range s{
fmt.Printf("%v",v)
}
fmt.Print("\n")
}
func main() {
v:=vector[int]{58,188}
printSlice(v)
vv:=vector[string]{"红烧肉","九转大肠"}
printSlice(vv)
}
泛型函数
package main
import "fmt"
type Addable interface{
type int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,
uintptr,float32,float64,complex64,complex128,string
}
func add[T Addable](a,b T) T {return a+b}
func main() {
fmt.Println(add(3,4))
fmt.Println(add("go","lang"))
}
新增了类型列表表达式,它是对类型参数进行约束
如果编译器通过得到的类型在Addable这个接口定义列表中,那么就可以允许这个类型参数实例化,否则就会报错。
interface约束泛
package main
import (
"strconv"
"fmt"
)
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())
}
return ret
}
func main() {
fmt.Printf("%T",showPriceList([]Price{22,33,55,88,99}))
}
go1.8-泛型的更多相关文章
- go1.18泛型的简单尝试
今天golang终于发布了1.18版本,这个版本最大的一个改变就是加入了泛型.虽然没有在beta版本的时候尝试泛型,但是由于在其他语言的泛型经验,入手泛型不是件难事~ 官方示例 Tutorial: G ...
- Go1.14发布了,快来围观新的特性啦
如期而至,Go1.14发布了,和往常一样,该版本保留了Go 1兼容性的承若,这个版本的大部分更新在工具链 .运行时库的性能提升方面,总的来说,还是在已有的基础上不断优化提成,大家期待的泛型还没有到来, ...
- go泛型教程
泛型 原文 在线阅读 导读: 约束 使用方法 实现原理 跟其它语言的泛型进行对比 用例子学泛型 issues 泛型需满足 go1.18+ 约束 go使用interface作为约束,约束的意思是约束了这 ...
- Go 1.18泛型的局限性初探
前言 Go 1.18 版本之后正式引入泛型,它被称作类型参数(type parameters),本文初步介绍 Go 中泛型的使用.长期以来 go 都没有泛型的概念,只有接口 interface 偶尔类 ...
- go-zero单体服务使用泛型简化注册Handler路由
一.Golang环境安装及配置Go Module https://go-zero.dev/cn/docs/prepare/golang-install mac OS安装Go# 下载并安装Go for ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- .NET面试题系列[8] - 泛型
“可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用.“ - Jon Skeet .NET面试题系列目录 .NET面试题系列[1] - .NET框架基础知识(1) .NET面试题系列[2] ...
- C#4.0泛型的协变,逆变深入剖析
C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...
- 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)
建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
随机推荐
- MRS_下载相关问题汇总
解决问题如下: MRS下载编译时,更改生成文件是HEX文件还是BIN文件 关于MounRiver下载时如何选择配置部分擦除 关于MounRiver下载起始地址配置问题 MRS下载编译时,更改生成文件是 ...
- 服务器搭建(CenOS 7 Apache + PHP _Mysql环境(LAMP))
服务器搭建(CenOS 7 Apache + PHP _Mysql环境(LAMP)) 第一步.更换阿里云 yum源 curl -o /etc/yum.repos.d/CentOS-Base.repo ...
- OpenStack命令行参考
OpenStack命令行参考 hello,大家好,这里是费冰.在使用OpenStack的过程中,固然我们可以通过 web 页面完成绝大多数的操作,但作为管理人员,不能不知晓 OpenStack 命令行 ...
- spring-in-action-初识反应式编程reactor
一:反应式编程 1.反应式编程的优点 1)无阻塞 2)处理的数据可以是无限的 打水仗: 命令式编程:使用的是水气球.水气球的容量有限.把水气球装水,再扔向对方.如果想要更多的水,就需要更多的水气球. ...
- Typora下载与安装 0.9.75版本
Typora下载与安装 效果图 一.简介 一款 Markdown 编辑器和阅读器 (0.9.75 版本 不需购买) 二.下载 下载地址:Typora 三.安装 1.下载文件后双击安装 2. 选择存放的 ...
- JS 格式化时间字符串
// 格式时间字符串 formatDateTimeStr(date, type) { if (date === '' || !date) { return '' } var dateObject = ...
- rpmbuild时为什么会出现空的debugsourcefiles.list?
错误: 空 %file 文件 /home/user/rpmbuild/BUILD/xxxx-0.1/debugsourcefiles.list 你看错误的里边有一个%file,这是使用spec文件构建 ...
- Hystrix容错监控机制
六:Hystrix容错监控机制 什么是微服务的容错机制 提前预设解决方案.,系统自主调节,遇到问题即时处理 什么是Hystrix Netfix 设计原则: 服务隔离机制 服务降级 熔断机制 提供实时的 ...
- 详解神经网络基础部件BN层
摘要:在深度神经网络训练的过程中,由于网络中参数变化而引起网络中间层数据分布发生变化的这一过程被称为内部协变量偏移(Internal Covariate Shift),而 BN 可以解决这个问题. 本 ...
- JZOJ 2474. 【GDKOI 2021普及组DAY2】我的世界
题解 这题很明显发现一个点到另一个点,必然最多只有一个进入下界的点和一个出来的点 分类讨论入点和出点的位置 要么都在 \(u->lca\) 或都在 \(lca->v\) 或分别有一个 那就 ...