go - 泛型
为什么要用泛型
在 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}))
}
go - 泛型的更多相关文章
- 一起学 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 ...
- C#泛型详解(转)
初步理解泛型: http://www.cnblogs.com/wilber2013/p/4291435.html 泛型中的类型约束和类型推断 http://www.cnblogs.com/wilber ...
- C# 泛型
C# 泛型 1.定义泛型类 在类定义中包含尖括号语法,即可创建泛型类: class MyGenericClass<T> { //Add code } 其中T可以遵循C#命名规则的任意字符. ...
- java8中lambda表达式的应用,以及一些泛型相关
语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...
- java 泛型
1.Student stu =tool.getObj();右边得到的是Object类型,需要向下转型,强转换. 2. 3. 4.泛型方法不能被静态修饰这样写 5.如果想定义定义静态泛型方法,只能这样写 ...
- Java泛型的历史
为什么Java泛型会有当前的缺陷? 之前的章节里已经说明了Java泛型擦除会导致的问题,C++和C#的泛型都是在运行时存在的,难道Java天然不支持“真正的泛型”吗? 事实上,在Java1.5在200 ...
随机推荐
- Channel和Stream的单双向问题
stream分为input和output,为单向. channel为双向,可以write也可以read,但是通过inputstream或者outputstream获取的channle并不能实现双向的数 ...
- ctfshow_web入门 文件上传
文件上传 还是是一边学习一边做笔记的文章,由于是学习,所以会显得啰嗦 还请各位师傅担待~ 如果有不正确的地方,请师傅们斧正谢谢师傅们 web150 火狐关闭js的插件一旦开启,就没法点击上传按钮了. ...
- 在真实世界中观察目标治疗策略实施1年对初诊RA患者的影响
在真实世界中观察目标治疗策略实施1年对初诊RA患者的影响 Tan AL, et al. Rheumatology 2016.Present ID: 083. 背景:制订目标治疗(T2T)建议是要将获得 ...
- 三年观察揭示TNF抑制剂持续改善强柱患者躯体功能的预测因子
标签:强直性脊柱炎; TNF抑制剂; 躯体功能; 预测因子 一项为期3年的观察研究揭示TNF抑制剂持续改善强直性脊柱炎患者躯体功能的预测因子 电邮发布日期:2016年3月28日 文献出处: van W ...
- 前端随笔0:URL与状态的双向绑定
记录一些最近写前端的思考总结,也算是给自己的技术随笔开个篇 在接触以 React,Vue 为代表的工程化前端框架前,我还是一个拿着 jQuery 手撸特效和手写 CSS 的切图仔,捣鼓 Vue 时接触 ...
- ABP微服务系列学习-使用Tye启动微服务
Tye是微软开源的一款开发人员工具, 能够用于简化微服务以及分布式应用程序的开发.测试以及部署过程.Tye 的首要目标是简化微服务的开发,具体方式包括仅用一行命令执行多项服务.在容器中使用依赖项目,以 ...
- ImGui渲染3d数据的方法
ImGui本质上是个2d渲染引擎,渲染3d数据只能另辟蹊径.目前主要有3种方法: 一是2d转换,可以自己处理3维坐标向屏幕坐标的转换,然后调用ImGui的二维绘制函数进行渲染: 二是3d贴图,首先在3 ...
- 41.Sentinel
Feign 整合 Sentinel 依赖 <!--Feign--> <dependency> <groupId>org.springframework.cloud& ...
- Pygame的基本应用(14周)
制作一个跳跃的小球游戏 创建一个游戏窗口,然后在窗口内创建一个小球.以一定的速度移动小球,当小球碰到游戏窗口的边缘时,小球弹回,继续移动.代码如下: import sysimport p ...
- 新的学习历程-python1 Hello World
1 print('hello world!') 2 if 2 > 0: 3 print('ok') 4 print('yes') 5 6 x = 3; y = 4 7 print(x + y) ...