interface - 如何实现可以接受可以在 golang 中进行相等性测试的任何类型的链表?

标签 interface go

我正在尝试在 golang 中实现一个链表。我希望链表能够存储任何可以进行相等性测试的类型。

如果有,就说

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

我希望能够做类似的事情,

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

我知道我可以使用接口(interface)来完成此操作。比如说,我可以创建一个具有比较功能的接口(interface),并使链表只接受具有接口(interface)类型的值。

但我想知道在 Golang 中是否有更好、更惯用的方法。

比如说,是否可以直接使用关系运算符 < , > , ==和合作?

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

谢谢

最佳答案

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

基本上,在您的包 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

这将获取列表的头部,使用提供的比较器对其进行排序并返回排序列表的头部。 客户将需要提供一个比较器,比如 with

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,用于你的排序实现。

关于interface - 如何实现可以接受可以在 golang 中进行相等性测试的任何类型的链表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21399082/

相关文章:

java - 每个 Java 域类都应该实现一个接口(interface)吗?

c# - 接口(interface)实现困惑

json - Unmarshal 中的动态类型

go - 使用 Go 包中的私有(private) "lowercase"函数

string - 使用 Go 截断 slice 的每个成员

go - 执行命令时如何使用文件作为标准输入

java - 无法分配最终字段,用于接口(interface)

java - 使用接口(interface)列表读取并保存对象列表

c# - 接口(interface)实现和返回类型

html - Golang 模板在不同的目录级别上提供 css