Go初学者
Goのmapやスライスを操作するコードを書いていて、やたらとレビュー指摘をもらったのでここにダメな操作と大丈夫な操作をメモしておく。例えば、こういうコードは余計なことをしているので直しなさいという指摘をもらった。 package main import "fmt" func …
この記事のソースコードはこちら ユニットテストを追加する頃合いに 文字列とファイルに対応した文字数カウント機能を作ったところで、これらのユニットテストを作る頃合いになってきた。 また、リクエストを受け取ってレスポンスに書き込むハンドラ関数のテ…
ファイルを読み込んで文字数を数える機能を追加する。 bufio.Reader.ReadRune()を使って対処。
はじめてのwebアプリのバグを直したところで、今度はJSONで結果を返す機能も追加してみる。 json.Marshalは構造体の公開フィールドしか出力してくれないので注意。
文字数カウントのwebアプリは、以下のバグがあるので直す。
Goも基本的な構文をだいたい覚えたので簡単なwebアプリを作ってみる。
Goは文字をUnicodeコードポイントで扱い、runeというデータ型を用意している。 unicode/utf8モジュールを使うとサロゲートペアが含まれる文字列でも安全に処理できる。
「2016年版Goのベストプラクティス」という記事を読んでいてgo installを使うことが推奨されていることを知った。
Goのプログラムを見ていて、何年ぶりか分からないくらい久しぶりにラベル付きbreakを見かけたので、せっかくなので試した。
Goで実行環境のメモリ使用量を調べるときはruntime.MemStatsが使える。 また、pprofモジュールを使うとより視覚的なビューを利用できる。
ポインタのことがやっと分かってきた感ある
ポインタのことがどうしても分からないのでまた考えてみたが、単純に「ポインタを使うと同じものを指す」とだけ覚えておけば良いんじゃないかと思うようになった。
ポインタがわからない。代入と関数を使った場合で色々試して(ちょっとは)理解を深めた。
GoでPythonのargparseみたいなサブコマンドを処理したい場合はflag.NewFlagSetというやつを使えば良いらしい。 Goでのやり方はこのページでドン!なんだけど。忘れないようにメモ。 [http://blog.ralch.com/tutorial/golang-subcommands/:title]
『プログラミング言語Go』のスピナー 予約語「go」を使うとメインgoroutineと別のgoroutineで動かせる 『プログラミング言語Go』の「ゴルーチンとチャネル」という章を読んでいて、メインルーチンの処理中にスピナーを回すサンプルコードが出てきたので自分…
乱数はシードを適切に初期化して使わないとランダムな結果を取り出せない。 また、time.Durationを算術演算する処理でまたしてもハマったのでメモしておく。
Goのtime.Sleepの引数はDurationという型で、数を直接引数に取るわけではない点に注意が必要。 0.5秒待機したい場合はtime.Sleep(500 * time.Millisecond)とする。
Goでデバッガを使いたい場合、gdb, delveといったツールは初心者には操作が難しい。 しかし、Visual Studio CodeのGo拡張機能が無料で利用可能なので、これを使うと便利。 裏でdelveを操作しているので、Visual Studio Code、Go拡張、delveの3つのインストー…
ユニットテストは特定の条件に依存せず、何度やっても同じ結果になるよう作ることが望ましいが、それを守ってテストコードを書くことはなかなか難しい。
Goのユニットテストはt.Error, t.Errorfというメソッドを使ってアサーションを行う。t.Fail()を呼ばなければ処理は打ち切られず、続行され、t.Errorで行った個別の検証はちゃんと分別整形して出力してくれる。
Goのrecoverはdeferと一緒に使わないと意味がないことを知った。
Goは予期されるエラーはすべてアプリケーション側で手当てし、安易に例外を送出するようなプログラムを書くべきではないらしい。 また、エラーを作るときは、fmt.Errorfが役立つ。
go buildでバイナリを作る go buildコマンドを実行すると、カレントディレクトリからmainパッケージを探してバイナリを作ってくれる。 Githubでの管理を念頭に推奨されるプロジェクト構成 go getでgithub.comから依存ライブラリを取ってくる importで自己な…
Goは関数の戻り値に名前をつけられて、defer文と組み合わせると不思議なことが色々できることを学んだ。
Goにはベンチマークテストライブラリが付属していて、性能試験を手軽におこなるらしい。結果に表示される数値の読み方がわからなかったので調べた。
GoのBuild Constraintsを使ってビルド成果物の内容を変える方法を学んだ。
Goのastモジュールの利用例を解読するため奮闘中
Goはパッケージトップレベルの関数をreflectで取り出せない。すごく難しいことをしないとダメらしい。
Goの日付フォーマットは年が「2006」、月が「01」、日が「02」。%Y-%m-%dじゃないし「2016-12-31」もダメ。
PythonのStringIOはGoでbytes.NewReader、などなど