2014-01-28 73 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按您的實施進行排序。

相關問題