为了账号安全,请及时绑定邮箱和手机立即绑定

实现“通用”节点列表

实现“通用”节点列表

Go
子衿沉夜 2021-09-10 17:21:04
我想用nodes实现一个链表。每个节点可以是不同的类型(Foo、Bar 和 Baz - 将是 40-50 个不同的节点),并且每种类型都有公共字段(prev、next 等)和一些特定于节点的字段。我很难想出一个看起来合理的解决方案。现在的问题是:我可以采取什么方法来使这更优雅?这是我的(假人)main.go:package mainimport (    "fmt"    "node")func main() {    a := node.NewFoo()    fmt.Println(a)    b := node.NewBar()    fmt.Println(b)    node.Append(a, b)}这是我的实现(node.go):package nodetype Node interface {}type FooNode struct {    prev               Node    next               Node    FieldSpecificToFoo int}type BarNode struct {    prev               Node    next               Node    FieldSpecificToBar int}type BazNode struct {    prev               Node    next               Node    FieldSpecificToBaz int}func NewFoo() *FooNode {    return &FooNode{}}func NewBar() *BarNode {    return &BarNode{}}func NewBaz() *BazNode {    return &BazNode{}}func Append(a, b Node) {    // set next and prev pointer    switch v := a.(type) {    case FooNode:        v.next = b    case BarNode:        v.next = b    case BazNode:        v.next = b    }    switch v := b.(type) {    case FooNode:        v.prev = a    case BarNode:        v.prev = a    case BazNode:        v.prev = a    }}这显然是一个非常糟糕的实现。在这种情况下我能做什么?
查看完整描述

1 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

我不完全确定我理解你想要做什么,但这里有一些想法:


使用标准容器

使节点包含您的“用户”数据作为接口:


type Node struct {

    next *Node

    Value interface{}

}

这(有点)就像在 C 中使用void*用户数据进行操作一样。


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信