チャットアプリ
RailsチュートリアルでもTDD推奨でしたが、この書籍では「ここまで細かく段階を分けて作っていくものなのか?」と思いました。
var buf bytes.Buffer tracer := New(&buf) ...
まずこのようなテストを書きます。
戻り値についても型宣言もしていません。
それからテストを実行し。
New関数がないので作り。
またテストを実行し。
引数を受け取れないので受け取れるようにし。
またテストを実行し。
戻り値を戻していないので、Tracerインタフェースを定義し、それを戻すようにし。
といった感じです。
少し驚き不安になりました。
今までの自分のプログラミング経験や、特にElmですと、自分は型から作っていった記憶があるからです。
(勘違いかも)
頭の中でどこまで出来上がっているかなどにもよると思うのですが、
関数 -> インタフェース -> 公開しない構造体
といった手順に見えました。
インタフェースも型といえば型なのかもしれませんが、関数の集まりを宣言しているようなもので、文章化が難しいのですが少し不思議です。
結局このパッケージは外部に構造体は出していません。
手続き型言語は関数から、関数型言語はデータからという傾向でもあったりするんでしょうか?
監訳者版tracer.goも日本の書籍にだけ載っているのですが、こちらではインタフェースは使わずにもっとシンプルです。
メソッドのレシーバをポインター型にするかどうかという判断も自信が持てません。
なんだか悩ましいところです。
引数をインタフェースにすることのほうが重要で、戻り値はそこまで重要ではないような気がします。
Go言語によるWebアプリケーション開発
今日からこの本を読んでいこうと思います。
この本を選んだ理由は、目次を見て実践的なアプリを作っているのではないかと思ったからです。
すでにインプット比率が高くなってしまっていると思いますが。
goで作ったもの
goplをほぼ読了して、現時点でgoで作ってみたものです。
テキスト処理
タイピングゲームでのお題になるテキストファイルをElmのファイルに変換するものを書いてみました。
flagパッケージが便利だと思いました。
ファイル名から拡張子を取り除いたものを得るには自前で用意しなきゃならないようです。
以前こういったものはRubyで書いていました。
サーバーサイドで使われる他の言語ですとエンタープライズ感があり、個人開発で自分が使う姿が想像しにくいのですが、こういったところもRubyやGoの好きなところです。
さらにGoは静的型チェックされるのでたのもしいです。
モニターを消すもの
非常に小さなものでプログラムもなにもないのですが、意外と使っています。
起動すると5秒後にモニターを消すループが走ります。
(ちょっとマウスの移動などでついても再び消えてもらうためです)
その間の時間も計測します。
「お腹痛い!」となりトイレに行くさいに起動します。
すると、15分使ってしまったがモニターの寿命が15分伸びてさらにエコといった感じです。
Goなので実行ファイルにできていいですね。
11章 テスト
11.6 Example関数
すごい。こんなものあるのかと思いました。
func ExampleAdd() { fmt.Println(Add(3, 4)) fmt.Println(Add(5, -1)) // Output: // 7 // 4 }
このようなものをhoge_test.go
に書いておき、godoc
するとドキュメントにコード例として表示されます。
さらにこのコードはgo test
で実際に実行されテストもされるので、型が違ったり結果が違うなど、ドキュメントが古くならないとのことです。
よくわかっていないのですが、fmtで印字されたものがチェックされるみたいです。
自分で作成したディレクトリでgodoc
を使ってみたかったのですが、やり方がわかりませんでした。
GOPATH
で設定されている%USERPROFILE%\go
の/src
にコピーしてgodoc
実行してみるとできました。
現在のディレクトリで実行することはできないんでしょうか?
これで11章が終わり、次は12章なのですが
この本の最後の二つの章では、reflectパッケージとunsafeパッケージを説明します。それらは、Goプログラマが日常的に使うパッケージではありませんし、使う必要があるGoプログラマはさらに少ないでしょう。もし、みなさんが相当な量のGoプログラムをまだ書いていないのであれば、今がGoプログラムを書く絶好の時期でしょう。
これで一旦読了としてしまったほうがいいのかもしれません。
流し読み程度で読み進めようと思います。
Example関数のような手法は、一般的にはDoctestというみたいです。
11章 テスト
11.4 Benchmark 関数
$ go test -bench=. -benchmem
これでベンチマークとメモリ割り当てを調べられます。
さっそくやってみました。
BenchmarkIsPalindrome-4 3548802 314 ns/op 248 B/op 5 allocs/op BenchmarkIsPalindromeB-4 3987262 309 ns/op 248 B/op 5 allocs/op BenchmarkIsPalindromeC-4 7521350 156 ns/op 128 B/op 1 allocs/op
最も速いプログラムはたいてい最も少ないメモリ割り当てを行うプログラム (p373)
らしいです。