Goを学び始めて

このブログの内容からは想像できないだろうが、自分はWeb系エンジニアとして働いている。その選択は正しかったのか今すごい葛藤しているけれども。

パーフェクトRuby on Rails

パーフェクトRuby on Rails

オシゴトではRubyばっか使ってきた。Railsが多いけど、SinatraとかPadrinoも使ったり。Railsを使っているとはいってもAPIサーバーの開発が主なのでGrape on ActiveRecordという感じもする。 しかしまぁ、最近はプロダクションでRubyが遅くて困る場面があったりRailsのバージョンアップに結構な時間をとられていたり、なによりRubyしか仕事で触っていない飽きもあって「Rubyばっかじゃつまんない、Go使ってみましょうよ!」的なことを訴えてみた。すると、案外すんなり「じゃあ、導入前に既存のサービス一個Goで再実装してみて。そしてうまく行ったら部内でエバンジェリストとして頑張って」ということに。1日のうち2時間位はそれにあてていいという許可ももらった。

自分自身はこの時点でGo Tourを一周やったくらいだったんだけれども、Go歴そこそこある人を巻き込み検証をはじめてみた。

新しい言語を学ぶといろいろ良いことがある、とはきいていたけど、実際よい経験になっていると思う。RubyとかPythonとかしか触ってなかったときには気づかなかったことに気づいた。

継承はあまり必要ない

Goには「継承」のしくみがない。

package main

import (
    "fmt"
)

type Base struct{}

func (b *Base) BFunc() {
    fmt.Print("hello")
}

type Inherited struct {
    Base
}

func main() {
    i := new(Inherited)
    i.BFunc()
}

というふうに、InheritedがBaseを継承したかのような振る舞いをさせることができる。しかし、これは実は

i.Base.BFunc()

シンタックスシュガーにすぎない。BfuncのレシーバーはあくまでBaseなのである。

オブジェクト指向設計原則にも「継承よりもコンポジション」というのがあるけど、実際継承が欲しいと思う局面はなかった。

昔右も左も分からなかったころ、「オブジェクト指向って何?」と人に聞いたら「車っていうものがあるけど、さらにスポーツカーとかSUVに分類されるよね…」みたいなよくある説明を受けたことがある。でも今思うとオブジェクト指向と継承って何の関係もないじゃないですか。(カプセル化とメッセージパッシングだよね?)

Goはオブジェクト指向言語ではない、といわれる。でも、コンポジションでプログラムを組み上げていくGoを学ぶことはオブジェクト指向な設計をするトレーニングになると思った。

ジェネリクスのありがたみ

自分はコンピューターサイエンスだとかプログラミング理論を学んできたバックグラウンドがなく、正直これまでジェネリクスと言われてもよくわかってなかった。でも、Goを触ってみて「ジェネリクスがない」ということの意味を思い知った。Rubyでやっていたのと同じように、 <コレクション>.map とやろうとしてふと気がつく。あれ、Goだとこれできないのか…。結果を格納する変数を用意して for ループをぐるぐる。なんかプログラミング勉強し始めたときのことを思い出した。

例外のありがたみ

ジェネリクスと同様に、例外がない言語を触ってはじめて例外のありがたさを知る。 Goの場合は「エラー」が発生する可能性のある処理を行うたびにエラー処理を直後に書く必要がある。エラー処理の見通しが悪くなってうーん。処理の流れを記述する部分と、「エラー」ハンドリングをする部分はわけて書きたいですよね。

ジェネリクス・例外はいずれ導入されてほしいな。

ちなみに、今までGo関連の書籍は2冊買った。

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

↑の本は入門者向けで、別に悪いとは思わないんだけどわざわざ買う必要ははなかったなという感想。初心者向けの記事なんて公式ドキュメントやらQiitaやら見れば十分間に合うでしょう。

Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る impress top gearシリーズ

Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る impress top gearシリーズ

↑は正直失敗。HTTPの仕組みを学ばせたいのかGoでのWebアプリケーション開発を学ばせたいのかまったくわからない。これは買っちゃだめです。