我正在尝试在 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 并了解了它在那个包中是如何完成的。它的实现方式是为该类型的一部分创建一个新类型,然后通过实现 Len、Less 和 Swap 使该新类型满足排序接口(interface)。
在我的案例中,我也可以在这里做同样的事情。但是必须创建一个新的 slice 类型,然后实现一些函数来满足一个接口(interface),当我一次只处理 2 个相同类型的值时……对我来说似乎有点过分了。
最佳答案
因为 Golang 不支持泛型,所以所有的容器都应该使用 interface{} 和 type assert,我认为没有更好的解决方案来满足您的要求。
关于go - 如何实现链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21693619/