2019年8月18日日曜日

読書環境

今日読んだ本、改訂2版 みんなのGo言語 (松木 雅幸(著)、mattn(著)、藤原 俊一郎(著)、中島 大一(著)、上田 拓也(著)、牧 大輔(著)、鈴木 健太(著)、技術評論社)の感想。

本著を見つけた時、初版を読んだし、そんな期間もすぎてないから入手するか迷う。ただ

全章を最新の内容にアップデートし、「第7章 データベースの扱い方」を新規で書き下ろし
ということで、入手して読んでみることに。

変わったこととして一番嬉しかったのは、内容を読まずとも並べればすぐ分かる、

この表紙の変更かも。この変更があったおかげで喜び倍増。ということで、変更がなかったら楽しみ半減だったかも。初版時に
あと、内容と関係ないかもしれないけど、表紙がカラフルだったり、Gopherʕ◔ϖ◔ʔがカワイイ。(これは好みによるかも。)ということで、しばらくは表紙が見えるように本棚に飾っておくことに。
と記述したのと同様、しばらくは改訂2版も、しかも初版と表紙が見えるように並べて飾っておくことに。

まず最初から最後まで読み終えて感じたこと。そんなに分厚い本ではないけどそれでも読みきるのが大変かなぁと思う人は、それぞれの章が独立した内容だから、自分が気になる、活用できそうな章を読むというのでも良さそう。私自身は現在Go言語を使う場面は、WindowsmacOSを両方使ってるから、どちらのOSでも使いたい簡単なツールの作成等。だからそのことを頭の片隅に置きながら本著を読み進めた。

どの章も面白かったけど、内容で特に有り難かったのは第6章のGoのテストに関するツールセット、テストの基礎と実践的なテクニックのTestable Examples、Unordered outputの項目。Gopherの人たちには当たり前なのかも知れないけど。今まで出力結果のテストをする時、TestXxxx関数しか知らなかったから、標準出力(os.Stdout)を画面からバッファーに切り替えてそこに出力し、そしてそれを取得して文字列と比較してテストするっていう手間のかかることをしてたけど、今後はその必要なく、簡単に快適にテスト出来るように。ただ、知らなかったことについて、ExampleXxxx関数は標準パッケージのテストでもよく使われてるみたいだから、まだまだGo言語の読む量が全然足りてないのかも。

その他、Go言語と関係ないかも知れないけど嬉しかったこととしては、改訂2版で新たに追加された「第7章 データベースの扱い方」で出てくるリレーショナルデータベースの例がPostgreSQLだったこと。特に制約がないとき、普段好んで使うのはSQLiteとPostgreSQLだったりするから。もちろん内容はPostgreSQLではなくても役立つ内容ではあるものの。

似たようなこととして、内容とは関係ないもののちょっとがっかりしたこととしては、「第1章 Goによるチーム開発のはじめ方とコードを書く上での心得」の1.1、開発環境の構築でインストールの例で出てくるのがbrewコマンドでHomebrewだったこと。私自身はmacOSではずっとMacPortsを利用してたりするから。本著やGo言語に限らず、最近 macOS のパッケージ管理ツールの例のほとんどが Homebrew な気がする、少なくとも私が読んだ本やサイトでは。MacPorts の人気が全然なくなってるのではないかなぁと思ったりしてちょっと心配。

他に、本著ではなくGo言語についてだけど、実用性とかは置いといて、Go言語はコンパイラーがGoで書かれたり、Goで閉じてるとこが魅力を感じている理由の一つでもあるから、「第1章 Goによるチーム開発のはじめ方とコードを書く上での心得」、「1.3 Goをはじめる」のタスクランナーとしてMakefileを使うっていうのの何かいい代替ないかなぁなんて思ったり。makeコマンドを使う準備となると、WindowsだとGoをインストールした上でさらに他の準備、しかもGoではないことの環境構築が必要になるから。いずれmakeコマンドではなくGo自身での解決策、代替、タスクランナーが出てくることをちょっと期待。ちょっとというのは自分自身で作ろうというのではなく他人任せだから。

最後に誤植かな、と思ったことを2つ。 まず一つ目は、第1章 Goによるチーム開発のはじめ方とコードを書く上での心得、1.2 エディタと開発環境の11ページの図2について、「gocdocの画面」ではなく「godocの画面」ではないかと。

もう一つは、第2章 マルチプラットフォームで動作する社内ツールの作り方、2.2 守るべき暗黙のルール、32ページの積極的にUTF-8を扱うのコードについて。本著のコードは

コード

var b1 byte = 'a'       // ok
var b1 byte = byte('あ') // ok
var b3 byte = 'あ'       // コンパイルエラー

変数名については各行別々のファイルに記述されてるコードとして、この二行目について、okではなくエラーではないかと。実際に手元の環境で確認。

コード

package main

func main() {
 var b1 byte = byte('あ')
}

入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal)

$ go run sample.go
# command-line-arguments
./sample.go:4:20: constant 12354 overflows byte
$ go build
# _/.../
./sample.go:4:20: constant 12354 overflows byte
$ 
1行目と3行目も一応試したら、コメント通りの結果に。

なので、本文の

しかし255を超える場合は明示的な型変換が必要になります。
というのも明示的に型変換してもbyte型の変数に代入できなかったり?あるいは型変換の方法が違う?

2つ目の問題については、手元の環境(macOS Mojave、go version go1.12.7 darwin/amd64)特有の問題で、誤植、誤りではないのかも。もしかしたらWindowsでは問題なかったり?

サポートページの正誤表に記述がなかったから、一応2つとも問い合わせから報告。

ということで、最初は入手するか迷ったものの、面白かったし、すぐに役立てることができること、いつか役立ちそうなことを知れたから、本著を読んでよかった今日この頃。

追記 2019/08/25: 第2章に出てくるruntimeパッケージのGOOSを利用した簡単なクロスプラットフォームなプログラムを書いてみた

0 コメント:

コメントを投稿