我會說你應該想法從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()
) …然後實現你的名單上排序功能這將需要調用者提供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
按您的實施進行排序。