为什么要用泛型

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 - 泛型的更多相关文章

  1. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  2. .NET面试题系列[8] - 泛型

    “可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用.“ - Jon Skeet .NET面试题系列目录 .NET面试题系列[1] - .NET框架基础知识(1) .NET面试题系列[2] ...

  3. C#4.0泛型的协变,逆变深入剖析

    C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...

  4. 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)

    建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...

  5. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  6. C#泛型详解(转)

    初步理解泛型: http://www.cnblogs.com/wilber2013/p/4291435.html 泛型中的类型约束和类型推断 http://www.cnblogs.com/wilber ...

  7. C# 泛型

    C# 泛型 1.定义泛型类 在类定义中包含尖括号语法,即可创建泛型类: class MyGenericClass<T> { //Add code } 其中T可以遵循C#命名规则的任意字符. ...

  8. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

  9. java 泛型

    1.Student stu =tool.getObj();右边得到的是Object类型,需要向下转型,强转换. 2. 3. 4.泛型方法不能被静态修饰这样写 5.如果想定义定义静态泛型方法,只能这样写 ...

  10. Java泛型的历史

    为什么Java泛型会有当前的缺陷? 之前的章节里已经说明了Java泛型擦除会导致的问题,C++和C#的泛型都是在运行时存在的,难道Java天然不支持“真正的泛型”吗? 事实上,在Java1.5在200 ...

随机推荐

  1. ctfshow_web入门 xss

    额,怎么说呢,对xss理解不深刻,虽然做了XSS-LAB,但是感觉不会用,看了群主的视频,知道了原因,用群主的话来说就是,X的是自己... 这个文章写得比较潦草... 准备一个带nc的工具: 无vps ...

  2. 【NOIP2017提高组正式赛】列队

    题解 本题的解法是丰富多彩的! 线段树做法是极好的 代码非常之少 一个很显然的想法是维护 \(n+1\) 颗线段树 那要怎么维护才能不爆空间呢? 我们发现尽管 \(n \times m\) 那么大 但 ...

  3. JZOJ 6904. 【2020.11.28提高组模拟】T3 树上询问(query)

    题目 你有一棵 \(n\) 节点的树 ,回答 \(m\) 个询问,每次询问给你两个整数 \(l,r\) ,问存在多少个整数 \(k\) 使得从 \(l\) 沿着 \(l \to r\) 的简单路径走 ...

  4. IP转换

    IP转换 目录 IP转换 1 127.1 ? 2 IPv4两段点分十进制表示 3 IPv4一段十进制表示 4 IPv4地址有效地变换形式 5 IP地址进制转换网站 6 参考博客 1 127.1 ? 首 ...

  5. 深入解读.NET MAUI音乐播放器项目(三):界面交互

    UI设计的本质是对于产品的理解在界面中多种形式的映射,当需求和定位不同时,对相同的功能表达出了不同的界面和交互方式. 作为播放器,界面可以是千差万别的.<番茄播放器>的iOS平台上我开发了 ...

  6. 自定义顺序表ArrayList

    1.简介 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素.使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通 ...

  7. Spring整合Mybatis原理

    Spring整合Mybatis原理 目录 Spring整合Mybatis原理 1.@MapperScan注解发挥作用 1.1.导入MapperScannerRegistrar类 1.1.2.执行Imp ...

  8. Android ViewModel,LiveData 简要分析

    ViewModel: 负责为关联UI(activity/fragment)进行数据管理,业务逻辑处理.不直接持有view引用,不对UI进行访问调用操作 对外通过暴露Livedata方式响应处理结果 L ...

  9. java学习日记20230227-dos原理

    DOS原理  磁盘操作系统 dis operating system md c:\\temp 创建文件夹 rd c:\\jyltemp 移除文件夹 相对路径和绝对路径  相对路径:从当前目录开始定位形 ...

  10. 实践:腾讯云IM搭建应用内类微信社交聊天模块

    社交模块是目前主流应用程序最常见的功能之一.有了社交模块,用户在您的应用内,可以自由的交流互动,并添加好友,关注其他用户等等.这可在很大程度上,促进您应用程序的活跃度,吸引用户留存,获取更多新用户,并 ...