2015-01-06 50 views
0

我想實現一個鏈接列表節點。每個節點可以是不同的類型(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 
    } 
} 

這顯然是一個非常糟糕的實現。在這種情況下我能做什麼?

回答

1

我不能完全肯定我明白你正在嘗試做的,但這裏有一些想法:

  • 使用standard container
  • 使節點包含您的「用戶」數據作爲接口:

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

這是(有點)像帶01做在C到用戶數據。

+0

謝謝!有時候解決方案很簡單。我想你明白我的問題。 – topskip