go1.8-泛型
2024-10-12 11:00:15
基本思想:
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}))
}
最新文章
- CGI与fastcgi与php-fpm与php-cgi的关系
- web前端学习随笔
- 钉钉js依赖库学习
- apache(nginx)+django+virutalenv(virtualenvwrapper)+gunicorn+supervisor配置高效web环境
- 1.2---翻转字符串(CC150)
- [CS231n-CNN] Image classification and the data-driven approach, k-nearest neighbor, Linear classification I
- UML类图关系-转
- linux+asp.net core+nginx+sql server
- POJ 1135 Domino Effect(Dijkstra)
- Swift - 继承UIView实现自定义可视化组件(附记分牌样例)
- hadoop2.x的变化
- MySQL 5.7中如何定位DDL被阻塞的问题
- sublime插件不能使用,提示plugin_host has exited unexpectedly
- 微信小程序-输入框输入文字后,将光标移到文字中间,接着输入文字后光标又自动跳到最后
- SpringBoot几个重要的事件回调、监听机制
- VB.NET只允许打开一个实例
- 搭建ssm环境
- editplus tag
- 请简单介绍一下什么是Spring?
- 从bios启动说起
热门文章
- 11月29日内容总结——SQL注入问题、视图、触发器、事务、存储过程、函数、流程控制、索引、慢查询、数据库三大范式
- .NET遍历二维数组-先行/先列哪个更快?
- GDOI2021游记
- 跳板攻击之:Netsh端口代理转发
- 【RocketMQ】Dledger日志复制源码分析
- 解析关于Tomcat Servlet-request的获取请求参数及几种常用方法
- DBeaver连接clickhouse无法下载驱动的情况
- ATC:一个能将主流开源框架模型转换为昇腾模型的神奇工具
- Switchquery:移动端秒级配置触达平台
- 如何调用别人的接口(包含get请求post请求)