大変良い本でした。Kindle 版を購入しました。

スターティングGo言語 amazon.co.jp

1 年前に買って積んでいたのは勿体なかったですが、最近ようやく
golang と向き合うようになったので、致し方なしか。

対応バージョンは 1.6 で最新の 1.9 より古いですが、golang は後方互
換性は保たれているので、あまり問題ないかと。

型や構文、よく使われるパッケージの説明など、網羅的に書いてあります。
ネット上の情報をつまむくらいなら、この本で学んだほうが良いと思いま
すよ…。> 過去の自分

一番良かったところ

私は元々組み込みエンジニアで、clang に馴染みがあります。そういう意
味では、golang は馴染みやすくはあるのですが、ポインタまわりがどう
もしっくり来ませんでした。

この本を読んで、その辺りを理解できて大変良かったです。

・(*p)[i] の省略が p[i] であるなど、ポインタ記法を省略できる
・参照型(スライス、マップ、チャネル)はポインタを取り扱う型である
・配列は値、スライスは参照型。性質は 180 度異なる
・配列は値であるため、代入ではすべての要素のコピー(clang だとポイ
ンタの代入)
・同じ理由で、関数の引数に渡すとコピーが作られ渡される

中でも、見た目が似ている配列とスライスが裏では全く違うことを知り、
腑に落ちました。

string 型は参照型ではありませんが、Immutable なポインタのような不
思議な振る舞いをします(clang だとほぼポインタ)。

・string 型は内部的に「文字列の実体へのポインタ」と「文字列のバイ
ト長」によって構成
・string 型の値を、変数への再代入や関数の引数として使った場合であっ
ても、文字列の実体が別のメモリ領域にコピーされることはない

何が値で何がポインタかを理解することは、プログラムのパフォーマンス
と大きく関係してくるので、今後もより理解を深めていきます。

雑多なメモ

・iota 知らなかった
・パッケージを別名で import した時、alias ではなく上書きになる
・文字列を range で for loop すると、byte ごとではなく、UTF-8 でエ
ンコードされた文字列のコードポイントごとに反復される
・予約語 fallthrough のこと忘れてた
・goroutine はスレッドよりも小さい処理単位である
・2 番目の変数名を ok とする → golang における一種のイディオム
・スライスの容量が足りなくなると、倍増して拡張する(場合による)
・メソッドはレシーバーを第1引数として取る単なる関数にすぎない
・fmt.Printf の %T は任意の型。reflect.TypeOf() 使ってたよ…
・GODEBUG 変数の説明は有益だった
・Example によるコードの実行と検証

今後の予定

次は『Goならわかるシステムプログラミング 』を読んでいきます。