Go読書会 #10 がランサーズ株式会社で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容はプログラミング言語Goを冒頭から皆で読み進めていくというものです。
進捗した内容
- 6章 メソッド
- 6.3 構造体埋め込みによる型の合成
- 6.4 メソッド値とメソッド式
- 6.5 例:ビットベクタ型
- 6.6 カプセル化
- 7章 インタフェース
- 7.1 契約としてのインタフェース
- 7.2 インターフェース型
話題に上がった話
6.3 構造体埋め込みによる型の合成
ここでは、構造体埋め込みによるメソッドの格上げ(promoted)と、一見のオブジェクト指向言語にある継承のように見えるこれは継承ではなく、派生クラスを作っているのでもないので気をつけること。とされている点が話題になりました。構造体が埋め込まれると、その構造体のメソッドがpromotedされて、埋め込まれた側の構造体のメソッドのように使えるようになりますが、これは、ラッパーメソッドが自動ではやされている為であり、違うものです。
この機能をうまく使うと、余計な記述をせずに、既存の機能をさもその構造体のメソッドであるかのように使うことができるので便利かつコードが読みやすくなります。
6.4 メソッド値とメソッド式
ここでは、特定のレシーバに結びつけている関数を生成するメソッド値(method value)
と、特定のレシーバーに結びついてないメソッド式(method expression)
がでてきました。メソッド式の方がちょっと特殊で以下のようになります。
m := Hoge.method_name
m('レシーバーに値するもの', '本来の引数')
特定の構造体の紐付いたメソッドを別の構造体インスタンスに使用することができるようになります。
6.6 カプセル化
ここでは、Goでのカプセル化に使用される可視性の制御である先頭が大文字であるかないか
と、実際にカプセル化がどのようなケースで役に立つかが話題になりました。いわゆる保守性を考えた場合に役に立つのと、実際に保守の際に役に立った例などが話されました。
7.1 契約としてのインタフェース
ここでは、PrintfとSprintfを例に出して、契約の定義
としてのインタフェースの話が出てきました。いわゆるjavaなので出てくるinterfaceに近いものかなと、その定義されたinterfaceの関数を満たすものは別の型で置き換えることができるのでプログラミングの自由度がまします。慣れてないといまいちぴんとこない感じはするのですが、定義を合わせるだけで型が違う処理を共通化できたりするのですごく便利です。
7.2 インターフェース型
ここでは、構造体で出てきた埋め込みがインタフェースでもやれることが書かれていました。そして、単一メソッドしか定義してないインタフェースを組み合わせて、新しいインタフェースを定義すると保守性などの観点で便利じゃないかということが話題になりました。
ここまで呼んだところで、時間になりました。次回は 7.3 インターフェースを満足する
からです。