我正在尝试在golang中实现链接列表。我希望链表能够存储可以执行相等测试的任何类型。
就像说,如果有,
type SimpleType struct {
int
}
s := SimpleType{3}
m := SimpleType{4}
我希望能够做类似的事情,
if s == m {}
或if s < m
以及其他相等测试。
我知道我可以使用接口完成此操作。比方说,我可以创建一个具有比较功能的接口,并使链接列表只接受具有接口类型的值。
但我想知道在Golang中是否有更好,更惯用的方法。
比如说,是否可以直接使用关系运算符<
,>
,==
和co?
或者,如果那是不可能的,那么使用接口本身有更好的方法吗?
由于
答案 0 :(得分:0)
我会说你应该将container/list
与来自sort.Interface
的想法结合起来。
基本上,在您的软件包mylist
中,您可以定义类似的内容:
type ListItem struct {
...
}
type Interface interface {
func Less(a, b *ListItem) bool
func Equal(a, b *ListItem) bool
}
(func Greater(a, b *ListItem) bool
不需要,因为它只是!Less(a, b)
;同样适用于NotEqual()
)
...然后在列表上实现排序功能,这需要调用者提供Interface
的实现,供你的algorythm使用 - 就像sort.Sort()
一样。
实现你定义
func Sort(head *ListElement, comp Interface) *ListElement
将获取列表的头部,使用提供的比较器对其进行排序并返回已排序列表的头部。 客户端需要提供比较器,如
import "github.com/Jay/mylist"
...
type Foo struct {
...
Id int // used for comparisons
...
}
type FooComp struct{}
func (FooComp) Less(a, b *mylist.ListItem) bool {
fa, fb := a.Value().(Foo), b.Value().(Foo)
return fa.Id < fb.Id
}
func (FooComp) Equal(a, b *mylist.ListItem) bool {
fa, fb := a.Value().(Foo), b.Value().(Foo)
return fa.Id == fb.Id
}
data := mylist.New()
head := mylist.PushBack(Foo{...})
// ... add more elements here
// Now sort the list using the comparator
head := mylist.Sort(head, FooComp{})
此处,客户端代码定义了自己的类型Foo
,要存储在列表中,还有一个比较器,FooComp
用于按实现进行排序。