不要使用指向接口类型的指针,而只需使用接口类型。
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)。



