Я хотел бы реализовать связанный список с узлами. Каждый узел может быть другого типа (Foo, Bar и Baz - будет 40-50 различных узлов), и каждый тип имеет общие поля (prev, next, ...) и некоторые определенные узлом поля.Реализовать список «generic»
У меня есть трудное время, чтобы придумать решение, которое выглядит разумным. Теперь вопрос: какой подход я могу предпринять, чтобы сделать его более элегантным?
Вот мой (манекен) 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
}
}
Это, очевидно, довольно дерьмовый реализации. Что я могу сделать в этом случае?
Спасибо! Иногда решение легко. Я думаю, вы поняли мою проблему. – topskip