go2 泛型

学习资料: https://gocn.vip/topics/10071

https://www.bilibili.com/video/av97437986?zw

1 泛型起源,go为什么需要泛型
还记得大学的时候王少荣老师教过c++,里面有一个多态的概念:同一形式表现出不同行为。具体来说呢:
1 临时性多态: 根据实际参数类型调用对应的函数。

func Add(a, b int) int {return a+b}
func Add(a, b float) float{return a+b}  // go 中无法使用同名函数

2 参数化多态: 根据实际参数类型生成不同的版本 , 支持任意数量的调用,即泛型

func Add(a, b T) T {return a+b}

这很容易让我们想起interface,泛型和它的区别在于。
当T为interface时,a和b可以是不同的类型,当使用泛型时a、b、返回值必须为同一类型。所以我们一般说泛型快&安全。 快=静态类型,安全=编译时会甄别错误。(类型推导错误判断)
既然go作为一门动态语言,所以泛型是很有必要的

go1 (2010 和 2011年 都有初始的泛型设计 模仿c++的做法)有诸多问题,跳过不写
13年设计的时候带入了类型推导,用户不需要写泛型的代码:

type Int int
func F(){
    a, b := 0, Int(1)
    m := MAX(a,b) // a先被忽略,解析b时认为a时Int
}

这里可以去看看类型推导公式。但是在类型推导的时候还是有很多问题。包括一些逻辑的矛盾。两个月出了一版非常完美的设计,但由于功能过于复杂,被写编译器的人否定了。。。然后泛型就被归档了。

后来14年有个人写了一版genny实现泛型,但是编译器无法做类型检查,开发人员如果粗心传错了参数,程序运行时会崩溃,总的来说就是不够安全。

15年bryan mills引入了一个gotype的版本,但gotype的类型推导还是用户自己写代码判断的。
之后再没人设计了。

在18年go 2要出生了,泛型问题一定要被解决。
引入了合约 contract。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值