Go読書会 #7 がランサーズ株式会社で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容はプログラミング言語Goを冒頭から皆で読み進めていくというものです。
進捗した内容
- 4章 コンポジット型
- 4.4 構造体
- 4.5 JSON
- 4.6 テキストテンプレートとHTMLテンプレート
- 5章 関数
- 5.1 関数宣言
- 5.2 再帰
話題に上がった話
4.4 構造体
ここでは、構造体とMapはどう違うんですか。という話がでてきました。確かにスクリプト系の言語を使っていると構造体を見かけないし、構造体の代用品のような使い方をされているのでそう言う質問がでてくるのもそんな不思議では無いかなと思いました。Mapは所謂hash tableと呼ばれるもので、ハッシュ値を添え字とした配列で、キーからハッシュ値を生成して添え字にして O(1)で検索出来るという特徴を持つデータ構造のことで、高速にデータ検索したいとか、ユニークな値を保証したいとかそういう用途、あとはWeb系だとログ集計とかによく使われますね。一方、構造体は、複数の変数をまとめて扱うための型ですかね。最近だとクラスだけの言語とかあるのでそれだと概ねクラスとプロパティがほぼそれに当たるかとは思います。実際にはアクセス制御とか諸々あるので大分違いますがイメージするならそんなところかなとは思います。
あと、個人的に気になったのは、構造体の宣言はフィールドをまとめて宣言したり、位置を買えたりしただけで違う型として認識される
というところと、同じ型をフィールドに宣言出来ない、したい場合はポインタ型を使う
というところでした。これは、構造体同士の比較で、フィールドの頭から比較を行っていくので宣言方法が変わると同一の比較にならないため違う型になるという理由でした。
他に話題になったのは、構造体の埋め込みフィールドですね。Goは構造体の宣言に型だけを埋め込むことによって直接その構造体にフィールドが有るかのように振る舞うことが出来ます。これは知っていないとバグにみえてしまうので要注意だと思います。
4.5 JSON
JSONでは、フィールドタグが話題になりました。これは、JSONは構造体からMarshalしてJSONに変換するのですが、コンパイル時に構造体へフィールドタグを付けておくと、名前を指定したものへ変換したり出来る機能です。それ以外にもオプションで、omitemptyやstringをしていして挙動を返ることが出来るのでJSONを扱うときはこれを使用すると余計な処理を書かずに済みそうです。
参考になりそうなURL
4.6 テキストテンプレートとHTMLテンプレート
ここでは、テキストテンプレートとHTMLテンプレートの使い分けについてが話題になりました。基本、Webで外部に向けて表示する場合はエスケープ機能のついたHTMLテンプレートの方を使った方が良いという話になりました。この辺の知識は安全なウェブサイトの作り方を読んでおくと言い気がします。
5.1 関数宣言
関数の型をシグニチャ(signature)なんですが、これは宣言された名前に関係なく、パラメータ列と結果の列が同じで有れば同じ型を持つというところが、構造体と違っていて面白いです。おそらくは、変数に関数を入れたりするのに同じシグネチャなら許容するためとか、あとは、恐らく比較を行わないのせいだとは思いますが、宣言をまとめられたりしても同じ型だと認識する点も気になりました。
あと、他の言語だと関数にデフォルトパラメータを持つことが有るのですが、Goの場合ないので何ででしょうかという話になりました。これは、あとで聞いたのですが、簡素化のために意図的にこの機能はないという話でした。
5.2 再帰
ここでは、関数のスタックがGoでは可変長であると言うことが話題になりました。普通の言語ではスタックは固定長であることが多く。これが再帰の呼び出しの深さの制限になります。試しにjsやrubyなどで再帰を実装してみると分かりやすいかもしれません。以前jsで再帰を書いたら割と早く限界がきました。
ここまで読んだところで時間になりました。次回は 5.3 複数戻り値からです。