なぜ今更?って感じだけど、最近golangの勉強を始めました。
理由は単純で、golangに触れる機会があって、なかなか面白そうって感じたからです。
個人的に気に入っているところはバイナリ化するのが簡単なところですかね。
あと処理速度が速いというところも。Rubyでいろいろと作ってサーバで動かしているけどそれをgolangのバイナリに置き換えたらどうなるんだろう?多少は負荷落ちるかな?っていう想いもあったりします。
ってことで、よくやっているRSSをParseする処理をgolangで書いてみました。
環境
みんな大好きcloud9環境でやってます。
Goのバージョンは以下。
$ go version go version go1.7.3 linux/amd64
やっていること
やっていることは
はてなブックマークのRSSを読み込んで、ブックマーク順で出力する
です。
色々調べたところ、encoding/xmlでやるやり方もあったのですが今回は検索で一番上に出てきた gofeed
というライブラリを使ってやってみました。
ソースコード
package main import ( "fmt" gofeed "github.com/mmcdole/gofeed" _ "reflect" "sort" "strconv" ) type HatenaItem struct { Title string Link string Hatebu int } type HatenaItems []HatenaItem func (b HatenaItems) Len() int { return len(b) } func (b HatenaItems) Swap(i, j int) { b[i], b[j] = b[j], b[i] } func (b HatenaItems) Less(i, j int) bool { return b[i].Hatebu > b[j].Hatebu } func main() { url := "http://b.hatena.ne.jp/hotentry/it.rss" fp := gofeed.NewParser() feed, _ := fp.ParseURL(url) items := feed.Items var hatenaitems HatenaItems for _, item := range items { extension := item.Extensions hatebu := extension["hatena"]["bookmarkcount"] var count int count, _ = strconv.Atoi(hatebu[0].Value) var hatenaitem HatenaItem = HatenaItem{item.Title, item.Link, count} hatenaitems = append(hatenaitems, hatenaitem) } sort.Sort(hatenaitems) for _, item := range hatenaitems { fmt.Printf("%d - %s - %s\n", item.Hatebu, item.Title, item.Link) } }
出力結果
こんな感じに出力されます。
苦労したところ
基本、gofeedのページの通りなのですが、すんなりいかなかったところがいくつか。
独自タグ
RSSのタグの <hatena:bookmarkcount>XXX</hatena:bookmarkcount>
をどうやってとるのかがわからなかったです。
Printで見てみたら一応保持してはいるもののそれがどこに格納されているのかがわからず、gofeedの公式ドキュメントをあさったら ext.Extensionsに入っていることがわかりました。
これに気が付くのに結構かかった・・・・
並び替え
これはまだまだ初心者だからなんですが、gofeed オブジェクトを直接並び替えの方法がわからなかった。
なので、HatenaItemsっていう構造体を自分で作って、その中に入れて並び替えをしています。
このやり方でいいのかどうか・・・変だと思ったらご指摘ください。
まとめ
まだまだこれからですねぇ。
とりあえずとっかかりとして今までRubyで作っていたものをgolangで書いたらどうなるのかってのからやっていこうと思っています。
今回作ったものを拡張してこれをSlackに投稿できるようにカスタマイズしようと思っています。
それではー。

- 作者: 松木雅幸,mattn,藤原俊一郎,中島大一,牧大輔,鈴木健太,稲葉貴洋
- 出版社/メーカー: 技術評論社
- 発売日: 2016/09/09
- メディア: 大型本
- この商品を含むブログ (3件) を見る