2014-01-28 62 views
1

我想在golang中实现一个链表。我希望链表能够存储任何可以进行平等测试的类型。如何实现链接列表,可以接受任何类型的平等测试可以在golang中完成?

好比说,如果有,

type SimpleType struct { 
    int 
} 
s := SimpleType{3} 
m := SimpleType{4} 

我希望能够做这样的事情,

if s == m {}if s < m和其他平等的测试。

我知道我可以使用接口完成此操作。就像说的那样,我可以创建一个具有比较函数的接口,并使链表只接受具有接口类型的值。

但是我想知道在Golang中是否有更好,更习惯的方式。

就像说,是否有可能直接使用关系运算符<,>, ==和co?

或者,如果这是不可能的,是否有更好的方法使用接口本身?

感谢

回答

0

我会说你应该想法从sort.Interface结合container/list

基本上,你的包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()) &hellip;然后实现你的名单上排序功能这将需要调用者提供Interface的实施以供您的过期—使用,就像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按您的实施进行排序。

相关问题