Go読書会 #6 がランサーズ株式会社で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容はプログラミング言語Goを冒頭から皆で読み進めていくというものです。
進捗した内容
- 3章 基本データ型
- 3.5 文字列
- 3.5.5 文字列と数値の変換
- 3.6 定数
- 3.6.1 定数精製器 iota
- 3.6.2 型つけなし定数
- 3.5 文字列
- 4章 コンポジット型
- 4.1 配列
- 4.2 スライス
- 4.2.1 append関数
- 4.3 マップ
話題に上がった話
3.5.5 文字列と数値の変換
Goの場合の文字列から数値の変換方法は、fmt.Sprintfかstrconv.Itoaのようです。ここで話題になったのは、人によってはSprintfで変換するのを好まない人がいるというのと、PHPの場合は、文字列として宣言しても普通に数値として扱えます。場面によってはintvalとか使って保証したいときもあるでしょうけど。
> php -a
php > $data = "42";
php > echo $data + 100;
142
あとは、何故Goの型の宣言がこの順番になったのかという質問がでて、その場では分からなかったんですが、Go's Declaration Syntaxに書かれていました。パースに関連していた用です。
3.6.1 定数精製器 iota
この、定数精製器iotaは割と珍しい機能なのでちょっとだけ話題になりました。特に例に出てくる1024の累乗に名前をつけるこの書き方_ = 1 << (10 * iota)
は面白かったです。
3.6.2 型つけなし定数
ここで気になったのは、コンパイラは、型に結びついてない定数を基本型の値よりもはるかに高い数値精度で表現します
というところで、型が定まってないので精度高い状態で表現しておかないとまずいのでこうなってるのだろうなと思いつつ。こういう遅延みたいなことができるんだと驚きました。
4.1 配列
ここでは、配列が固定長であることのメリットは何なのかという疑問がでました。動的に確保するのは余計な処理が入りますし、パフォーマンス面が大きいとは思います。
4.2 スライス
ここでは、スライスの構造そのものに対しての初見の人は割と面食らっていました。話題になったのは、スライスに対するlenとcapが返す値がなんなのかでした。確かにスライス演算子を使用した場合のlenはともかくcapは分かりづらいです。しかし、中に書かれている図が割と分かりやすかったのでそれで助かりました。
4.2.1 append関数
ここで、実際にスライスに対して項目を足していく処理を行える関数appendが出てきました。ここで出てきたAppendIntの説明でスライスがどうやってデータを増やしているかなどが分かりやすく書かれていたので良かったです。ちなみに、現在のAppendIntは中身がformatBitsというものになっていてこの本の内容とはちょっと変わっていました。
そのあと、Intがあるなら、他にも有るだろうと言うことでAppendStringとかAppendFloatとかを参加者で探してみたりしました。
4.3 マップ
スクリプト言語を扱っていると割と使用されるデータ構造ですね。ここでは、マップのkeyをforなどで取り出した場合、その順序がランダムなのか入れた順番が保持されているのかということが話題になりました。PHPの場合は順番が保持されていて、Perlの場合は5.18からhash randomizationが導入され、キーの順序が保証されなくなりました。C++のSTLでは自前でソートする必要があるようです。
ここまで読んだところで時間になりました。次回は 4.5 構造体からです。