我正在golang中进行一个简单的链表实现,用于学习目的.元素的定义如下:
type Element struct {
next, prev *Element
Value interface{}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,Value可以是满足空接口的任何东西.现在,作为一个新功能,我想这样做,当你在列表中插入一个新元素时,它会以排序的方式插入它 - 每个元素将<=下一个.
为了做到这一点,我写了以下方法:
func (l *LinkedList) Add(val interface{}) *Element {
this := &l.Root
e := Element{Value: val}
for {
if this.next.Value != nil && this.next.Value < val { // <-comparison here
this = this.next
} else {
return l.insert(&e, this)
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨operator < not defined on interface哪个是公平的.所以我理解在我的Element typedef中,我应该将Value限制为可以使用<运算符进行比较的类型.我在研究golang不支持运算符重载的问题时学到了这一点 - 我不是想这样做.相反,我只是想确保Element.Value是一个可以使用<运算符进行比较的类型.我该怎么做呢?
在我看来,简单地定义基于内置的新类型可能并不困难,可以通过某种功能进行比较.所以我写了这个烂摊子(以及其他尝试做同样事情的方法):
type Comparable interface {
LessThan(j interface{}) bool // …Run Code Online (Sandbox Code Playgroud)