interface很好用啊,为啥要泛型?

来源:6-1 接口的概念

remembers

2020-02-18

ccmouse老师您好!如题,我在用go语言实现一个avl树或者红黑树的时候,需要在每一个node里面存储一个泛型(T,因为在设计的时候我并不知道要存什么样的数据类型)。所以我的做法是这样的: 我在node里面存一个interface,当需要维护整个树的时候就要对相关node之间进行compare,于是我让interface里面定义一个Compare方法。基于这样的定义之后,站在使用者的角度,只需为我的struct实现Compare方法就可以作为相应的泛型来使用。

所以,我的问题是,既然interface能够解决此类问题,为什么我经常看到社区里有泛型的讨论?或者说想请教一下老师,还有什么样的场景是必须要泛型不可的?

另外,老师认为Go2会加泛型吗?

写回答

1回答

ccmouse

2020-02-18

的确社区里很多讨论都没有完全理解泛型的意义和作用。不过你这个场景的确是一个泛型能够带来好处的场景。

在没有泛型的情况下,这个Compare当然是拿着两个interface{}。假设我使用的时候只想把它用于存储int类型。在插入元素的时候编译器没法提供检查,必须要等到运行时调用Compare的时候,才由自己写的类型检查来报错。

这里如果有泛型的话,你这个就是Tree<T>,必须提供一个Compare<T> (Java里叫Comparator)。我如果实例化成Tree<Integer>,那么必须提供一个Compare<Integer>的实例来比较。插入元素的时候,也必须是插入Integer。这些都是编译时就能保证的。

Go2我认为是会加泛型的。不然没必要叫Go2,继续在Go1的框架下迭代就行。

2
3
remembers
回复
ccmouse
明白了!感谢老师!
2020-02-21
共3条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程