go - 如何实现链表

标签 go

我正在尝试在 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 函数来决定将元素放置在链表中的什么位置。

我的问题是...

  1. 有更好的方法吗?比上面的解决方案好很多的东西。

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

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

最佳答案

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

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

相关文章:

go - 1600 万个协程 - "GC assist wait"

unit-testing - 如何使用结构/接口(interface)来模拟依赖项以进行测试

go - Gin 框架无法从 Postman 获取数据

vim - snipMate 文件类型设置不正确

go - 为什么 Go 使用 ^ 而不是 ~ 来表示一元按位非?

go - Go 1.5 和 1.6 中 yacc 的向后兼容性

encryption - 用公钥解密

go - 记录 Golang 程序的惯用方式,由一个 main.go 文件组成

go - 如何在 golang 中使用 mux 和 gorm 发布 body raw?

windows - GO C 风格控制台应用程序