栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用接口为任意类型创建队列

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用接口为任意类型创建队列

不要使用指向接口类型的指针,而只需使用接口类型。

Queuable
是接口类型,因此在您使用过的代码中的任何地方都
*Queuable
将其更改为
Queuable
。例如:

type Queuable interface {    Next() Queuable}type Node struct {    value interface{}    next  Queuable}// Next gets the next objectfunc (n *Node) Next() Queuable {    return n.next}...

在Go中,接口类型的值存储一对:分配给变量的具体值以及该值的类型描述符。

有关界面内部的更多信息:反射定律#界面的表示形式

因此,您几乎永远不需要接口的指针。接口包含键/值对,其中键可以是指针。指向接口的指针有意义的罕见情况是,您想修改传递给另一个函数的接口类型变量的值。

在您的示例中,该类型之所以

*Job
实现,
Queuable
是因为该类型具有一个具有接收器类型的方法
*Job
,因此在需要值的任何地方都可以使用
Queuable
*Job
(并且
Queuable
将创建和使用类型的隐式接口值)。

回到您的示例:

Queuable
只定义了一种方法来获取队列中的下一个元素,但没有一个方法将其排队,这会使该解决方案失去灵活性。单个
Next()
方法仅描述它是
“排队的”, 但不是(必需) “排队的”

为了 排队, 我还要添加另一种方法:

SetNext(Queuable)

type Queuable interface {    Next() Queuable    SetNext(Queuable)}

其实现

Node
例如可以是:

func (n *Node) SetNext(q Queuable) { n.next = q }

在上尝试一下

[Go Playground](http://play.golang.org/p/2RCRpV_NBX)

还要注意的是有一些代码重复

Node
Job
,作为
next
Next()
SetNext()
方法。我们可以创建一个基本节点实现,例如:

type base struct {    next Queuable}func (b *base) Next() Queuable     { return b.next }func (b *base) SetNext(q Queuable) { b.next = q }

现在你可以嵌入这个

base
在您的具体类型
Node
Job
实现其将“继承”的
next
领域,
Next()
SetNext()
方法,所以你不必定义对任何这些
Node
Job
类型。

这是全面落实

Node
Job
,没有别的要求:

type Node struct {    *base    value interface{}}type Job struct {    *base    instruction string}

在上尝试一下

[Go Playground](http://play.golang.org/p/Fv9HbYJyhQ)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/401477.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号