我想在golang中实现一个排序后的链表。而且我很难想出一种通用的方法来使链表能够与任何可以与自身进行比较的类型一起工作。由于它是一个排序列表,我希望'去编译器'确保可以比较插入到链表中的值。golang实现链表
例如,
import "linkedlist"
type Person struct {
name string
}
func main() {
l := linkedlist.New()
p := Person{"Jay"}
l.insert(p)
}
在上述例子中,如何使编译器保证其类型“人”的值“P”可以与也具有类型“人另一值进行比较”。我希望编译器在被插入的值不适合的情况下捕获错误。
我可以做这样的事情,
import "linkedlist"
type Element interface {
func IsGreater(v Element{}) bool
}
type Person struct {
name string
age int
}
func (p *Person) IsGreater(p1 interface{}) bool {
if ok, v := p1.(Person); ok && p.age > v.age {
return true
}
return false
}
,然后链表的“插入”功能中我可以使用IsGreater
功能来决定在哪里放置元素的链表。
我的问题是...
- 有没有更好的方式来做到这一点?比上述解决方案好得多的东西。
我已经经历了sort.Sort并看到它如何在该包中完成。它完成的方式是为该类型的片段创建一个新类型,然后通过实现Len,Less和Swap使该新类型实现排序接口。
我在这里也可以做同样的事情。但是不得不创建一个新的切片类型,然后实现一些函数来满足一个接口,当我一次只处理2个相同类型的值时......对我来说似乎有点矫枉过正。
你不能这样做。至少不是以一种很好,简单而正确的方式。 Go没有泛型。如果您的解决方案的这种混合安全性足够好:使用它。对于程序员来说,实现一些功能应该是可以的。 – Volker