今川館

都内勤務の地味OLです

Go初学者

Goのnilのmapやスライスで許されない操作

Goのmapやスライスを操作するコードを書いていて、やたらとレビュー指摘をもらったのでここにダメな操作と大丈夫な操作をメモしておく。例えば、こういうコードは余計なことをしているので直しなさいという指摘をもらった。 package main import "fmt" func …

はじめてのwebアプリ⑤ ユニットテストを追加

この記事のソースコードはこちら ユニットテストを追加する頃合いに 文字列とファイルに対応した文字数カウント機能を作ったところで、これらのユニットテストを作る頃合いになってきた。 また、リクエストを受け取ってレスポンスに書き込むハンドラ関数のテ…

はじめてのwebアプリ④ アップロードファイルの扱い方

ファイルを読み込んで文字数を数える機能を追加する。 bufio.Reader.ReadRune()を使って対処。

はじめてのwebアプリ③ JSONで結果を出力する

はじめてのwebアプリのバグを直したところで、今度はJSONで結果を返す機能も追加してみる。 json.Marshalは構造体の公開フィールドしか出力してくれないので注意。

はじめてのwebアプリ② unicode/utf8で文字数を数える

文字数カウントのwebアプリは、以下のバグがあるので直す。

はじめてのwebアプリ① net/httpのHandleFunc

Goも基本的な構文をだいたい覚えたので簡単なwebアプリを作ってみる。

サロゲートペアの入った文字列を処理する場合の注意点

Goは文字をUnicodeコードポイントで扱い、runeというデータ型を用意している。 unicode/utf8モジュールを使うとサロゲートペアが含まれる文字列でも安全に処理できる。

go installを使え -- QCon London 2016

「2016年版Goのベストプラクティス」という記事を読んでいてgo installを使うことが推奨されていることを知った。

ラベル付きbreak, continue, goto

Goのプログラムを見ていて、何年ぶりか分からないくらい久しぶりにラベル付きbreakを見かけたので、せっかくなので試した。

runtime.MemStatsでメモリ使用量を調べる&pprofモジュール

Goで実行環境のメモリ使用量を調べるときはruntime.MemStatsが使える。 また、pprofモジュールを使うとより視覚的なビューを利用できる。

ポインタが分からない③

ポインタのことがやっと分かってきた感ある

ポインタが分からない②

ポインタのことがどうしても分からないのでまた考えてみたが、単純に「ポインタを使うと同じものを指す」とだけ覚えておけば良いんじゃないかと思うようになった。

ポインタがわからない①

ポインタがわからない。代入と関数を使った場合で色々試して(ちょっとは)理解を深めた。

Goのflagパッケージを使ってサブコマンドを作る

GoでPythonのargparseみたいなサブコマンドを処理したい場合はflag.NewFlagSetというやつを使えば良いらしい。 Goでのやり方はこのページでドン!なんだけど。忘れないようにメモ。 [http://blog.ralch.com/tutorial/golang-subcommands/:title]

ANSIエスケープコードを使ってコンソールアニメーション

『プログラミング言語Go』のスピナー 予約語「go」を使うとメインgoroutineと別のgoroutineで動かせる 『プログラミング言語Go』の「ゴルーチンとチャネル」という章を読んでいて、メインルーチンの処理中にスピナーを回すサンプルコードが出てきたので自分…

Goの乱数&time.Durationの算術演算

乱数はシードを適切に初期化して使わないとランダムな結果を取り出せない。 また、time.Durationを算術演算する処理でまたしてもハマったのでメモしておく。

Goでスリープしようとしてハマった

Goのtime.Sleepの引数はDurationという型で、数を直接引数に取るわけではない点に注意が必要。 0.5秒待機したい場合はtime.Sleep(500 * time.Millisecond)とする。

Visual Studio Codeを使ってGoのコードをデバッグする

Goでデバッガを使いたい場合、gdb, delveといったツールは初心者には操作が難しい。 しかし、Visual Studio CodeのGo拡張機能が無料で利用可能なので、これを使うと便利。 裏でdelveを操作しているので、Visual Studio Code、Go拡張、delveの3つのインストー…

Goでユニットテストの書き方② 実践編

ユニットテストは特定の条件に依存せず、何度やっても同じ結果になるよう作ることが望ましいが、それを守ってテストコードを書くことはなかなか難しい。

Goでユニットテストの書き方① 基礎編

Goのユニットテストはt.Error, t.Errorfというメソッドを使ってアサーションを行う。t.Fail()を呼ばなければ処理は打ち切られず、続行され、t.Errorで行った個別の検証はちゃんと分別整形して出力してくれる。

Goのエラー処理② panicとrecover

Goのrecoverはdeferと一緒に使わないと意味がないことを知った。

Goのエラー処理① エラー処理の基本的な考え方

Goは予期されるエラーはすべてアプリケーション側で手当てし、安易に例外を送出するようなプログラムを書くべきではないらしい。 また、エラーを作るときは、fmt.Errorfが役立つ。

go buildを試しつつGoのパッケージの規則を覚えた

go buildでバイナリを作る go buildコマンドを実行すると、カレントディレクトリからmainパッケージを探してバイナリを作ってくれる。 Githubでの管理を念頭に推奨されるプロジェクト構成 go getでgithub.comから依存ライブラリを取ってくる importで自己な…

Goは関数の戻り値に名前を付けられる / deferの驚き

Goは関数の戻り値に名前をつけられて、defer文と組み合わせると不思議なことが色々できることを学んだ。

Goのベンチマークテストを試した

Goにはベンチマークテストライブラリが付属していて、性能試験を手軽におこなるらしい。結果に表示される数値の読み方がわからなかったので調べた。

GoのBuild Constraints

GoのBuild Constraintsを使ってビルド成果物の内容を変える方法を学んだ。

Goの抽象構文木の利用例を読んだ

Goのastモジュールの利用例を解読するため奮闘中

Goはパッケージトップレベルの関数をreflectで取り出せない

Goはパッケージトップレベルの関数をreflectで取り出せない。すごく難しいことをしないとダメらしい。

Goの日付フォーマットの謎

Goの日付フォーマットは年が「2006」、月が「01」、日が「02」。%Y-%m-%dじゃないし「2016-12-31」もダメ。

Goのファイル・ファイルライクオブジェクトもろもろ

PythonのStringIOはGoでbytes.NewReader、などなど