我正在尝试在 golang 中实现一个链表。我希望链表能够存储任何可以进行相等性测试的类型。
如果有,就说
type SimpleType struct {
int
}
s := SimpleType{3}
m := SimpleType{4}
我希望能够做类似的事情,
if s == m {}
或 if s < m
和其他平等测试。
我知道我可以使用接口(interface)来完成此操作。比如说,我可以创建一个具有比较功能的接口(interface),并使链表只接受具有接口(interface)类型的值。
但我想知道在 Golang 中是否有更好、更惯用的方法。
比如说,是否可以直接使用关系运算符 <
, >
, ==
和合作?
或者,如果这不可能,是否有更好的方法使用接口(interface)本身?
谢谢
最佳答案
我会说你应该结合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
的实现以供您的算法使用——就像 sort.Sort()
一样。
实现你定义的
func Sort(head *ListElement, comp Interface) *ListElement
这将获取列表的头部,使用提供的比较器对其进行排序并返回排序列表的头部。 客户将需要提供一个比较器,比如 with
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
,用于你的排序实现。
关于interface - 如何实现可以接受可以在 golang 中进行相等性测试的任何类型的链表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21399082/