2014-02-11 73 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