我想用节点实现链接列表。每个节点可以是不同的类型(Foo,Bar和Baz - 将是40-50个不同的节点),每种类型都有公共字段(prev,next,...)和一些特定于节点的字段。
我很难想出一个看似合理的解决方案。现在的问题是:我可以采取什么方法来使这更优雅?
这是我的(虚拟)main.go
:
package main
import (
"fmt"
"node"
)
func main() {
a := node.NewFoo()
fmt.Println(a)
b := node.NewBar()
fmt.Println(b)
node.Append(a, b)
}
这是我的实现(node.go
):
package node
type 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
}
}
这显然是一个非常糟糕的实现。在这种情况下我该怎么办?
答案 0 :(得分:1)
我不完全确定我明白你要做什么,但这里有一些想法:
使节点包含您的“用户”数据作为接口:
type Node struct {
next *Node
Value interface{}
}
这有点像(在某种程度上)在C中使用void*
用户数据。