我正在尝试在 Go 中实现一个排序的链表。而且我很难想出一种通用方法来使链表适用于任何可以与自身进行比较的类型。由于它是一个排序列表,我希望“go 编译器”确保可以比较插入到链表中的值。

例如,

import "linkedlist"

type Person struct {
  name string
}

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

在上面的示例中,我如何让编译器确保可以将类型为“Person”的值“p”与另一个类型为“Person”的值进行比较。我希望编译器在插入的值不是合适的值的情况下捕获错误。

我可以做这样的事情
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 函数来决定在链表中放置元素的位置。

我的问题是...
  • 有没有更好的方法来做到这一点?比上面的解决方案好得多的东西。

  • 我已经通过 sort.Sort 并看到它是如何在该包中完成的。它的完成方式是为该类型的 slice 创建一个新类型,然后通过实现 Len、Less 和 Swap 使该新类型实现排序接口(interface)。

    在我的情况下,我也可以在这里做同样的事情。但是必须创建一个新的 slice 类型,然后实现一些函数来满足接口(interface),当我一次只处理 2 个相同类型的值时.. 对我来说似乎有点过头了。

    最佳答案

    因为 Golang 不支持泛型,所以所有的容器都应该使用 interface{} 和 type assert,我认为没有更好的解决方案来满足您的需求。

    关于go - 如何实现链表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21693619/

    10-16 10:59