基本思想:

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}))
}

最新文章

  1. CGI与fastcgi与php-fpm与php-cgi的关系
  2. web前端学习随笔
  3. 钉钉js依赖库学习
  4. apache(nginx)+django+virutalenv(virtualenvwrapper)+gunicorn+supervisor配置高效web环境
  5. 1.2---翻转字符串(CC150)
  6. [CS231n-CNN] Image classification and the data-driven approach, k-nearest neighbor, Linear classification I
  7. UML类图关系-转
  8. linux+asp.net core+nginx+sql server
  9. POJ 1135 Domino Effect(Dijkstra)
  10. Swift - 继承UIView实现自定义可视化组件(附记分牌样例)
  11. hadoop2.x的变化
  12. MySQL 5.7中如何定位DDL被阻塞的问题
  13. sublime插件不能使用,提示plugin_host has exited unexpectedly
  14. 微信小程序-输入框输入文字后,将光标移到文字中间,接着输入文字后光标又自动跳到最后
  15. SpringBoot几个重要的事件回调、监听机制
  16. VB.NET只允许打开一个实例
  17. 搭建ssm环境
  18. editplus tag
  19. 请简单介绍一下什么是Spring?
  20. 从bios启动说起

热门文章

  1. 11月29日内容总结——SQL注入问题、视图、触发器、事务、存储过程、函数、流程控制、索引、慢查询、数据库三大范式
  2. .NET遍历二维数组-先行/先列哪个更快?
  3. GDOI2021游记
  4. 跳板攻击之:Netsh端口代理转发
  5. 【RocketMQ】Dledger日志复制源码分析
  6. 解析关于Tomcat Servlet-request的获取请求参数及几种常用方法
  7. DBeaver连接clickhouse无法下载驱动的情况
  8. ATC:一个能将主流开源框架模型转换为昇腾模型的神奇工具
  9. Switchquery:移动端秒级配置触达平台
  10. 如何调用别人的接口(包含get请求post请求)