Slide 1

Slide 1 text

Gunosy.go  #2   container     Gunosy  Inc.

Slide 2

Slide 2 text

自己紹介 •  印南 聡志  (いんなみ さとし)   •  6月にGunosyに入社   •  Java/Ruby  …  最近  Python/Go  始めました    

Slide 3

Slide 3 text

Container •  h?p://golang.org/pkg/container/   •  データのまとまりを扱うためのパッケージ    – List  :  双方向連結リスト   – Ring  :  循環リスト   – Heap  :  二分木構造リスト(用Interface)  

Slide 4

Slide 4 text

List •  双方向連結リスト   – 各エレメントが前後のエレメントへのリンク    (ポインタ)を所持   – インサートは高速だがインデックス参照は不可   – ジェネリクスの機能はなし   •  型アサーションを使う必要がある   Element   value Element   value Element   value root next  *Element prev  *Element next  *Element prev  *Element

Slide 5

Slide 5 text

List  –  type  Element •  type  Element     – 双方向リストの要素(エレメント)、格納するデータ、 前後のリストのリンクを持つ   – Value  interface{}     – func (*Element)  Next   – func  (*Element)  Prev    

Slide 6

Slide 6 text

List  –  type  List •  type  List          func  New()  *List          func  (l  *List)  Back()  *Element          func  (l  *List)  Front()  *Element          func  (l  *List)  Init()  *List          func  (l  *List)  InsertATer(v  interface{},  mark  *Element)  *Element          func  (l  *List)  InsertBefore(v  interface{},  mark  *Element)  *Element          func  (l  *List)  Len()  int          func  (l  *List)  MoveATer(e,  mark  *Element)          func  (l  *List)  MoveBefore(e,  mark  *Element)          func  (l  *List)  MoveToBack(e  *Element)          func  (l  *List)  MoveToFront(e  *Element)          func  (l  *List)  PushBack(v  interface{})  *Element          func  (l  *List)  PushBackList(other  *List)          func  (l  *List)  PushFront(v  interface{})  *Element          func  (l  *List)  PushFrontList(other  *List)          func  (l  *List)  Remove(e  *Element)  interface{}

Slide 7

Slide 7 text

List h?p://play.golang.org/p/7GnwWoC-­‐_s 出力:   1   2   3   4

Slide 8

Slide 8 text

Ring •  循環リスト   •  どのリング要素のポインタもリング全体への参照と して使用可能   •  (Javaのような)ジェネリクスの機能はなし   •  型アサー(ry   prev  *Ring next  *Ring prev  *Ring prev  *Ring next  *Ring next  *Ring

Slide 9

Slide 9 text

Ring  –  type  Ring    func  New(n  int)  *Ring      func  (r  *Ring)  Do(f  func(interface{}))      func  (r  *Ring)  Len()  int      func  (r  *Ring)  Link(s  *Ring)  *Ring      func  (r  *Ring)  Move(n  int)  *Ring      func  (r  *Ring)  Next()  *Ring      func  (r  *Ring)  Prev()  *Ring      func  (r  *Ring)  Unlink(n  int)  *Ring  

Slide 10

Slide 10 text

Ring h?p://play.golang.org/p/2SqEm4PGHT 出力:   要素数:    10   0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5  6  7  8  9      

Slide 11

Slide 11 text

Heap •  二分木構造   •  取り出される値が常に最小になる   – Init,  Fix,  Pop,  Push,  Remove実行時にmin-­‐heapが 走る     •  List,  Ringとは異なり自身で定義した配列型に heap.interfaceを実装  

Slide 12

Slide 12 text

Heap •  実装する必要のある関数   – func(Interface)  Pop()     – func(Interface)  Push()   – func  (Interface)  Len()   – func  (Interface)  Less()   – func  (Interface)  Swap()   デモ:h?p://play.golang.org/p/QIxb4gHIkW  

Slide 13

Slide 13 text

まとめ •  Container   – データのまとまりを便利に扱うためのパッケージ   •  List  :  双方向連結リスト   •  Ring  :  循環リスト   •  Heap  :  2分木構造   – インサートが高速   – インデックスでの要素指定ができない