Go読書会 #5 がランサーズ株式会社で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容はプログラミング言語Goを冒頭から皆で読み進めていくというものです。
進捗した内容
- 3章 基本データ型
- 3.1 整数
- 3.2 浮動小数点
- 3.3 複素数
- 3.4 ブーリアン
- 3.5 文字列
- 3.5.1 文字列リテラル
- 3.5.2 Unicode
- 3.5.3 UTF-8
- 3.5.4 文字列とバイトスライス
話題に上がった話
3.1 整数
ここだと、C言語だとshort,int,longなどになっていましたが、Goだとint8,int16...int64といった形に統一されたことが話題に上がりました。確かにこの方が分かりやすいです。型で表現可能なビットを超えるとオーバーフローを起こして、型に収まらない上位のビットは黙って破棄されるそうです。動的言語でこのへんを割とよろしくやってくれるものに慣れている人は要注意でしょう。
あとは、Web開発で目にすることはあまりないのですが、ビット演算が話題になりました。参加者の方にバイオ系では割とビット演算を使うという話をお聞きしました。PerlだとバイオインフォマティクスのためのPerl入門があったりするのでバイオ系では疲れているみたいです。
もう一つは、fmt.Printfを使うときに以下の様に第1引数の中で指す第二引数をしていすると、同じ値を何個も並べる必要が無いことが例からわからりそこも話題になりました。
fmt.Printf("%d %[1]o %#[1]o\n", o)
3.2 浮動小数点
ここだと、IEEE754を全部読んだことある人いますかと聞いてみたんだけど、いませんでした。自分もWikipediaで読んだぐらいで見たことはないです。確か有料で良いお値段するという話になりました。
個人的には、浮動小数点の限界値がmathパッケージに記述されていると言うことできになって確認してみました。
NaN(not a number)がうかつに比較すると全部falseになるという話が気になって、定義場所をみにいったり、なぜその値になったのかを確認しにいったりしました。
NaN() の中身
// NaN returns an IEEE 754 ``not-a-number'' value.
28 func NaN() float64 { return Float64frombits(uvnan) }
uvnanの値
package math
6
7 const (
8 uvnan = 0x7FF8000000000001
最終的に0x7FF8000000000001この値がGCCからきたことは分かったのですが、なんでこれになったのかはまだ分かっていません。
3.4 ブーリアン
ここで面白かったのは、&&と||の優先順位の覚え方が乗っていて、&&が乗算で||が加算だからこれを覚えていれば()とか使わずに綺麗にコード書けるね。と書かれていたところです。そこまで気を遣って書かれてるんですね。
3.5 文字列
ここだと、「文字列が不変なバイト列」であること「部分文字列演算」が話題になりました。Cのように配列へ直接違う文字をいれて変更することが出来ないとか、(私の知っている範囲だと)関数型の用にs[i:j]という記法を用いて対象範囲の新たな文字列を生成するという
演算のコトです。
3.5.3 UTF-8
UTF-8デコーダーが、期待していない入力バイトを処理するとUnicode置換文字\uFFFD
が生成されることが話題になりました。実際に組んだことがある人から、この文字見たことあるという話が出てきました。
3.5.4 文字列とバイトスライス
ここでは、path/pathnameでOS間移植を前提にする場合はつかったほうがいいという話と、bytes.Bufferがファイルの代わりにioを必要とするところで使えることが話題になりました。
ここまで呼んだところで、時間になりました。次回は 3.5.5 文字列と数値の変換 からです。