2017-01-29 8 views
1

私は注文リストのための構造を持っています。私は注文mapがほしいと思う方法を見つける。しかし、私はすべてのタイプのためにこれを作成したくない、それは私が持っている。別のコードが必要なのでしょうか?または、どのように普遍的に書き直すことができるのですか。すべてのタイプで使用できます。PrevNextです。どのように汎用構造体を使用

type Post struct { //for example 
    P string 
    O int 
    Prev, Next *Post 
} 
type Act struct { 
    I int 
    Prev, Next *Act 
}  

type Map struct { 
    Act   map[int]*Act 
    First, Last *Act 
} 

func (m *Map) New(a *Act) int { 
    Ida++ 
    f := Ida 
    a.Id = Ida 
    m.Act[Ida] = a 
    if m.First == nil { 
     m.First = a 
    } else { 
     m.Last.Next = a 
     a.Prev = m.Last 
    } 
    m.Last = a 
    return f 
} 

func (m *Map) Del(s int) { 
    if _, ok := m.Act[s]; ok { 
     if m.Last == m.First { 
      m.Last = nil 
      m.First = nil 
      delete(m.Act, s) 
      return 
     } 
     if m.Last == m.Act[s] { 
      m.Last = m.Act[s].Prev 
      m.Act[s].Prev.Next = nil 
      delete(m.Act, s) 
      return 
     } 
     if m.First == m.Act[s] { 
      m.First = m.Act[s].Next 
      m.Act[s].Next.Prev = nil 
      delete(m.Act, s) 
      return 
     } 
     m.Act[s].Prev.Next = m.Act[s].Next 
     m.Act[s].Next.Prev = m.Act[s].Prev 
     delete(m.Act, s) 
     return 
    } 
} 
+1

できません。 GOはジェネリックを持っていません:) – Nadh

+0

@Nadh私はそれを書き直す必要がありますか?別の[質問](http://stackoverflow.com/questions/41887596/golang-map-sort)にお答えできますか?要素が必要な要素の前に、earlieを削除できるため、配列の順序は使用しません。そして私は心配します、それは別の要素を削除します – Kojan

答えて

2

あなたはPrev()Next()メソッドを実装するすべてのタイプの仕事と機能を定義することができます。たとえば、次のようなものです

type List interface{ 
    Next() List 
    Prev() List 
    First() List 
    Last() List 
    Value() interface{} 
    SetNext(List) 
    SetPrev(List) 
} 
func Del(l List, elem_to_delete interface{}){ 
    for e:=l.First(); e != l.Last(); e = l.Next() 
     if l.Value() == elem_to_delete{ 
      l.Prev().SetNext(l.Next()) 
      l.Next().SetPrev(l.Prev()) 
      break 
     } 
    } 
} 
//and implement those methods for your types 
type Post struct { //for example 
    P string 
    O int 
    Prev, Next *Post 
} 
func (p Post) Next() List{ 
    return p.Next 
} 
... 
//and then you can call Del() with any of this types 
Del(post, 5) 

また、stdlibで定義されているリストデータ構造があります。

1

方法としてNextPrev操作を定義する場合:

type PrevNext interface { 
    GetNext() *Act 
    GetPrev() *Act 
    // ... and all other required actions 
} 

だから、あなたがいないメソッドとしてではなくのオブジェクトを想定し、一般的な機能としてDel()を定義することができます:あなたは、インターフェイスを持っている可能性が

type Act struct { 
    I int 
    Prev, Next *Act 
} 

func (a *Act) GetNext(){ 
    return a.Next 
}  

PrevNextタイプであり、すべての必要な操作がメソッドとして定義されています。

func Del(m *PrevNext, s int) { 
    if _, ok := m.Act[s]; ok { 
     if m.GetLast() == m.GetFirst() { 
      m.SetLast(nil) 
      m.SetFirst(nil) 
      delete(m.Act, s) 
      return 
     } 
    // .... 
    } 
} 
関連する問題