Open6
Go初心者が驚くところ
Typed-Nilを格納したインターフェース型がnil判定できないこと
interface型は「型と値」を保持するので「型付きnil」を有意な(not 空)値として扱う。
真に「空」にするには「型なしnil=nilリテラル」を代入する必要がある。
JSONと相互変換する構造体フィールドは頭文字が大文字
- 小文字始まりのJSONオブジェクトフィールドを作るにはフィールドタグをつける。
- json2goなどを利用しよう。
構造体をあらかじめ定義することについて
- これは静的型処理系にとって簡易な型チェックを当てはめる仕組みを兼ねている
- JSONを正しく解釈するための必要な後続処理の一部を担ってくれる
- 手間以上のメリットがあるので構造体定義は「Goにとって」は良い手法
世の中にあるJSONデータの一部が変動構造定義だというのは誤解であることが多いです。複数の構造定義の混成定義で状況に応じて部分的にオミットされているだけという構造がほとんどで、本当に構造が変動する定義はレアケースのはず。
typeA,typeB,typeCの3パターンが変動しているように見える構造も以下のように定義されていて、いずれか以外が省略されているだけという定義をするのが一般的です。
{
"typeA": {...},
"typeB": {...},
"typeC": {...}
}
日付の書式指定文字列
アメリカの日付要素の連番になっている。
- Month
- Day
- Hour
- Minute
- Second
- Year
- Offset
ISO形式は2006-01-02T15:04:05Z07:00
という書式文字列になる。
またこの方式の良いところもある
- ゼロパディングの有無のコントロールが直感的
- スペースパディングは「_」を頭につける
- Hourで03ならゼロパディング、15なら24h方式になるというのは直感的
- 05.999とすればミリ秒精度表示になる05.999999999とすればナノ秒精度
- 他の言語処理系では単純にゼロサプレスできない場合もある
以下は覚えにくくリファレンスを見る必要があるけれど、レアケースなので大きな問題じゃない。
- 曜日はMondayやMon
- 時間帯はMST
- 午前・午後はPM
コード生成がカジュアルに採用されている
- Goではパッケージ単位でシンボルを扱うので、複数ファイルでパッケージを構成することが容易
- 構造体メソッドの定義を複数のファイルに分散して記述できる(パーシャルクラス定義の概念が不要)
- つまり、手書きのメソッド定義とコード生成のメソッド定義の混成が容易
- また、コード生成+gofmtを行うコードをGoで書いておくことで「//go:generate go run ...」という記述ができる
- gofmtされた出力結果なので生成コードも読みやすい
- 以上のことからGoはコード生成とは相性が良いと言える
マジックコメントが何種類もある上にどんどん拡張追加されるし記法もバラついている
- これに関しては最初の言語仕様の時にメタ情報付与するための書式があればよかったとは思うがもう時すでに遅し
- 記法は統一に向けて調整が進み始めているところ
- 記法から特殊コメントであることは明確にわかるようになったので「メタ情報付与するための書式」と言えなくも無い