2014-02-11 72 views
3

我想在golang中實現一個排序後的鏈表。而且我很難想出一種通用的方法來使鏈表能夠與任何可以與自身進行比較的類型一起工作。由於它是一個排序列表,我希望'去編譯器'確保可以比較插入到鏈表中的值。golang實現鏈表

例如,

import "linkedlist" 

type Person struct { 
    name string 
} 

func main() { 
    l := linkedlist.New() 
    p := Person{"Jay"} 
    l.insert(p) 
} 

在上述例子中,如何使編譯器保證其類型「人」的值「P」可以與也具有類型「人另一值進行比較」。我希望編譯器在被插入的值不適合的情況下捕獲錯誤。

我可以做這樣的事情,

import "linkedlist" 

type Element interface { 
    func IsGreater(v Element{}) bool 
} 

type Person struct { 
    name string 
    age int 
} 

func (p *Person) IsGreater(p1 interface{}) bool { 
    if ok, v := p1.(Person); ok && p.age > v.age { 
    return true 
    } 
    return false 
} 

,然後鏈表的「插入」功能中我可以使用IsGreater功能來決定在哪裏放置元素的鏈表。

我的問題是...

  1. 有沒有更好的方式來做到這一點?比上述解決方案好得多的東西。

我已經經歷了sort.Sort並看到它如何在該包中完成。它完成的方式是爲該類型的片段創建一個新類型,然後通過實現Len,Less和Swap使該新類型實現排序接口。

我在這裏也可以做同樣的事情。但是不得不創建一個新的切片類型,然後實現一些函數來滿足一個接口,當我一次只處理2個相同類型的值時......對我來說似乎有點矯枉過正。

+3

你不能這樣做。至少不是以一種很好,簡單而正確的方式。 Go沒有泛型。如果您的解決方案的這種混合安全性足夠好:使用它。對於程序員來說,實現一些功能應該是可以的。 – Volker

回答

1

因爲Golang不支持泛型,所以所有的容器應該使用interface {}並鍵入assert,我認爲沒有更好的解決方案滿足您的需求。

0

這個庫函數已經存在:

http://golang.org/pkg/container/list/

http://golang.org/pkg/container/ring/

您可以reflect.DeepEqual比較列表。

如果要實現使用類型檢查的鏈接列表,請爲列表type MyLinkedList struct { *list.List}和列表type Element struct{ *List.Element }中的項目創建一個嵌入式結構。然後,您可以實施list.List的所有方法,並根據需要進行類型檢查。

+1

這不回答問題 - 在'container/list'中,值的類型爲'interface {}',這是不可比較的。 – domoarrigato