
なぜ今更?って感じだけど、最近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件) を見る