请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

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

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

正在回答

1回答

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

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

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

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

2 回复 有任何疑惑可以回复我~
  • 提问者 remembers #1
    老师,就是说,基于编译时检查的泛型会比我现在用interface更加性能好(因为interface有运行时消耗)是吗?
    而不是说,没有泛型就interface就解决不了问题了,对不对。
    回复 有任何疑惑可以回复我~ 2020-02-18 09:57:34
  • ccmouse 回复 提问者 remembers #2
    对,两者都能解决问题。主要关注点是我们更希望在编译时发现错误而不是运行时。这样我们如果代码写错了就编译不过,强制我们去改正。如果是运行时,谁也不知道,最坏情况在生产环境才挂掉。当然性能也是一点,不过比较次要。
    回复 有任何疑惑可以回复我~ 2020-02-20 21:52:39
  • 提问者 remembers 回复 ccmouse #3
    明白了!感谢老师!
    回复 有任何疑惑可以回复我~ 2020-02-21 11:38:26
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信