2014年1月24日金曜日

Golang Cafe #13を開催しました。

Golang Cafe #13を開催しました。

今回は、containerパッケージを見ていきました。サンプルはgithubにありますので、ごらんください。

まず、container/heapパッケージの使い方ですが、heap.Interfaceという独自のinterfaceを実装する必要があります。

http://golang.org/pkg/container/heap/#Interface
http://golang.org/pkg/sort/#Interface

heap.Interfaceはsort.InterfaceのCompositeですから、メソッドを5個実装しなければいけません。結構面倒です。ですが、データ構造がプログラマが自由に決定するようになっていますから、プログラマでその辺りは、管理しなければいけないようです。

以下のメソッドはsort.Interfaceから継承したものです。
Len() int
ヒープの長さ(データ量)を返す

Less(i, j int) bool
大小関係をチェックする(i番目とj番目の比較。i > jの条件にすると大きい順にすることもできる。)

Swap(i, j int)
データの入れ替え(i番目とj番目)を入れ替える。

残りは、heap特有のインターフェイスです。
Push(x interface{})
heapにデータを追加します。

Pop() interface{}
heapからデータを取り出します。

intafaceを実装したら、最初にヒープの初期化を行います。heap.Init()を呼び出します。
実装例はheapsample.goにあります。今回は、UnitTestを行うので、パッケージの初期化時にいれてみました。

データの追加方法は、
heap.Push(golangcafeheap, member)
のように行います。第1引数は、heap.Init()で指定した、heap.Interfaceを実装したインスタンスを指定します。heapパッケージのPushを呼び出すと、Push後に並び替え処理が実行されるようになります。

データの取り出しは
heap.Pop(golangcafeheap)
のように行います。引数はPushの時と同じものを指定します。heap.Pushと同じようにPop()時も並び替えが行われます。

データの削除はheap.Remove()を呼び出せば削除されます。
heap.Fix()は、何が起こるのかよくわかりませんでしたが、heapの動きがしっかり理解できていれば意味がわかるのかもしれません…。

heapパッケージのサンプルを作るのに苦戦してしまって、ringのサンプルが間に合いませんでした…。

container/listパッケージですが、
PushBack() 末尾に追加
PushFront() 先頭に追加
InsertAfter() ある要素の次に追加
InsertBefore() ある要素の前に追加
を試しました。これは、単純なLinked Listですから、構造も複雑ではないので、難しく無いと思います。他にも関数はありますが、今回は実行しませんでした。
サンプルコードはlistsample_test.goです。

container/ringパッケージは、リングバッファを実現するためのパッケージです。
循環するので、終了条件が面倒に感じましたが、「全てのオブジェクトに対して、何か処理をする」という要求に答えるのには、便利なものなのかな?と思いました。
サンプルコードは、ringsample_test.goです。

ただ、サンプルコードが間に合わず、GolangCafeで集まった時にサンプルを動かしていたのですが、ポインタとType Assertionの組み合わせでハマってしまい、動くコードになるまで時間がかかってしまいました。ポインタに対しても、正しい型を指定してあげないと、Type Assertionはfalseを返してくるのでC言語と同じようにプログラマが型を正しく把握していないとハマってしまう原因になるので注意が必要です。

https://plus.google.com/114183076079015753160/posts/jCXqzMiaC2u

次回は、flagパッケージを見ていく予定です。