2015-01-06 2 views
0

Я хотел бы реализовать связанный список с узлами. Каждый узел может быть другого типа (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 
    } 
} 

Это, очевидно, довольно дерьмовый реализации. Что я могу сделать в этом случае?

ответ

1

Я не совсем уверен, что понимаю, что вы пытаетесь сделать, но вот несколько идей:

  • Используйте standard container
  • сделать узел содержит данные «пользователь» в качестве интерфейс:

    type Node struct { 
        next *Node 
        Value interface{} 
    } 
    

Это (несколько), как это делать в C с void* к данным пользователя.

+0

Спасибо! Иногда решение легко. Я думаю, вы поняли мою проблему. – topskip