りんごとバナナとエンジニア

エンジニア修行の記録

「Go言語らしくGoコードを実装するための手法と思想」を読んだ感想

昨年末、海外出張の機内で暇つぶしのつもりで読んだのですが、最近Go言語を学び始めた私にとって思った以上に良い本でした。

表紙

Go言語というのは他の言語に比べて書き方や文化が独特です。
そのため、他の言語に慣れた身では戸惑うことも多く、「Go言語らしい書き方」というのをなかなかつかみにくいことが多いと思います。
この本は、いくつかの具体例を挙げながら「Go言語らしさとは何か」を説明することにフォーカスした本です。

まず第1章でUNIX哲学と絡めて、「ひとつの責務に集中させる」「連携可能にする」という大原則が提示されます。
そして第2章以降で、これらの原則が実際のコードでどう使われていくかを見ていくという内容になっています。

この本を読んで最も大きな学びになったのは、interfaceの重要性です。
適切に設計されたinterfaceは、内部の処理を隠蔽し、interfaceだけ見ればそのパッケージの役割が過不足なくわかるような状態を実現します。
また、コードを直すときも、interfaceを手直しせずに済ませることができれば、修正の影響範囲を抑えられます。

第2章ではinterfaceの活用例としてGo言語標準のsortパッケージが登場するのですが、これがとても素晴らしい例でした。
sortパッケージでは、ソートという作業を「要素の数」「2要素の比較基準」「2要素の入れ替え処理」の3つさえわかっていればできるものだと考え、この3つに対応するメソッドをinterfaceに入れています。

// https://golang.org/pkg/sort/#Interface

type Interface interface {
        // Len is the number of elements in the collection.
        Len() int
        // Less reports whether the element with
        // index i should sort before the element with index j.
        Less(i, j int) bool
        // Swap swaps the elements with indexes i and j.
        Swap(i, j int)
}

この3つの具体的な内容は外部で定義させ、自身は全体のソート作業のマネジメントという一つの責務に注力しているわけです。
interfaceの内容も過不足がないため、外部で Swap() などのメソッドの中身を変えれば、sortパッケージを修正しなくても別のやり方のソートを実行できます。

また、この本の親切な点は、例として挙げられているコードがとてもシンプルなことです。
各章のコードは、標準のsortパッケージ・英単語を大文字にする処理のテストコード・画像をエンコーディングするCLIツールなど、中身が単純でわかりやすいものばかりです。並行処理は全く出てきません。
この点は賛否が分かれるかもしれませんが、初心者でも適切な書き方を理解しやすいよう、内容を絞った結果なのだろうと思っています。

わずか33ページしかない薄い本ですが、Go言語を書くうえで知っておきたい考え方がムダなく詰まっています。もっと早く読んでおけば回り道せずに済んだのになあと後悔しています。
今後Go言語に興味を持ったばかりの方に出会ったら、ぜひおすすめしたい一冊です。

booth.pm