GoRevel Chat

これが本命というか、本丸というか、Golangらしいというか・・・。
いや、並列処理の塊ですよ。
ゴルーチンを使って、あれこれするんですが、今までそんな事かすりもしないできたもんで、苦労する苦労する。
それで、一昨日睡魔が襲ってきたって事なんですけど。


いやいや、それで、ココを見ると要点がばっちり書いてあるんですが、
http://revel.github.io/samples/chat.html
中身はそんなに甘くない!ツーかワシの勉強不足なんですが・・・。
chan型(チャンネル型)の、動きがイマイチつかめん。

var (
	// Send a channel here to get room events back.  It will send the entire
	// archive initially, and then new messages as they come in.
	subscribe = make(chan (chan<- Subscription), 10)
	// Send a channel here to unsubscribe.
	unsubscribe = make(chan (<-chan Event), 10)
	// Send events here to publish them.
	publish = make(chan Event, 10)
)

func chatroom() {
	archive := list.New()
	subscribers := list.New()

	for {
		select {
		case ch := <-subscribe:
			// Add subscriber to list and send back subscriber channel + chat log.
		case event := <-publish:
			// Send event to all subscribers and add to chat log.
		case unsub := <-unsubscribe:
			// Remove subscriber from subscriber list.
		}
	}
}

基礎からわかる Go言語

基礎からわかる Go言語

を片手に、解析して「なんとなく」わかった気に・・・。
JAVAとかC#とか、Rubyでも何でも良いけど、スレッド処理がすっごい簡単だけど、selectとかchanとか、理解に苦しむ場面が・・・。
selectのcaseは、実行可能なchanがあると、それが実行される・・・・って所が、今までに無い感覚ですわ。

func (c WebSocket) RoomSocket(user string, ws *websocket.Conn) revel.Result {
	// Join the room.
	subscription := chatroom.Subscribe()
	defer subscription.Cancel()

	chatroom.Join(user)
	defer chatroom.Leave(user)

	// Send down the archive.
	for _, event := range subscription.Archive {
		if websocket.JSON.Send(ws, &event) != nil {
			// They disconnected
			return nil
		}
	}

サンプルソースそのままコピペしますが、前半の部分ココまでが、接続初回の処理になるようです。
後は、ゴルーチンと永久ループで、接続しっぱなしってのを実現してるっぽいです。

なんか、node.jsの方がすっきりしてね?
そもそも、websocketってなによ!!

nodeだと、socket.ioで実装した気がする・・・。
それに、roomが自由に作れたはず・・・。

んん??
この実装だと、chatroom一つしか作れなくね?


だとすると、socket.ioでの実装が吉ではないかと・・・。
と思ったら、こんなモジュールが!
https://github.com/googollee/go-socket.io

ついでに、実装した人もいるみたい。。。

○Go lang勉強会でgo-socket.ioの話してきた
http://yosuke-furukawa.hatenablog.com/entry/2014/08/11/095157

性能に関してはまだまだNode.jsの実装の方が歴史が長いだけあって高速だし安定してました。
というわけで、まだ出来上がったばかりという感は否めなくて、これを使ってリアルタイムなアプリを作るのは現時点ではオススメできないです。

(`ハ´)アイヤー


でも、まぁモジュールもつい最近更新されてるし、ちょっと頑張ってみましょうか!