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 ...
随机推荐
- Mat数据结构
1.MAT类: OpenCV从2001年开始发展,在最初使用的是c语言,使用的是IplImage数据结构来存储图像,但是最大的问题需要手动申请释放内从( manual memory managemen ...
- 【TS】泛型以及多个泛型参数
泛型 给函数或者属性定义类型的时候,类型是固定的,当业务发生变动时可能不好维护,例如:函数类型固定为string,后续需求更改不好维护,比如需要传入number类型,那么这个函数就不适用了 funct ...
- 挖矿僵尸网络蠕虫病毒kdevtmpfsi处理过程
背景: pgsql连接时候报错org.postgresql.util.PSQLException: FATAL: sorry, too many clients already, 意思是client已 ...
- JZOJ 1038. 【SCOI2009】游戏
题目 自己找 思路 大致过程见 JZOJ 3232. [佛山市选2013]排列 而本题改成种类数 那么我们不需要 \(ln\) 这个东东 直接转移 \(f\) 改成种类数 对于可能转移过来的状态,直接 ...
- 代码随想录算法训练营day09 | leetcode 28. 实现 strStr()
LeetCode 28. 实现 strStr() 牢记一点:next[i] 元素表示[0,i]子串的最长相等前后缀个数,也是模式串与主串匹配不相等时模式串的下一个比较索引 分析1.0 前缀是指不包含最 ...
- vs修改默认端口
1.右键项目属性进去修改 2.,用txt打开sln解决方案,框框中的就是你当前的端口号
- Spring Cloud Alibaba 整合 Seata 实现分布式事务
在Spring Boot单体服务中,添加@Transactional注解就能实现事务.在单体服务中,执行事务都是在同一个数据库下进行.但是随着业务越来越复杂,数据量越来越大会进行分库分表.在微服务场景 ...
- .Net DI(Dependency Injection)依赖注入机制
1.简介 DI:Dependency Injection,即依赖注入,他是IOC的具体实现. 在DI中,底层服务对象不再负责依赖关系的创建,而是交由顶端调用进行管理注入 好处:降低组件之间的耦合度,使 ...
- Git提交代码报错husky > pre-commit,
拉取了新项目以后,git突然不能用了 报husky > pre-commit, 解决办法:进入你的项目显示隐藏git文件 进入git文件 找到 hooks / pre-commit ...
- 【语义分割】使用DAFormer测试自己的数据集
DAFormer: https://github.com/lhoyer/DAFormer window运行shell命令: 使用git bash pip 安装包超时: pip --default-ti ...