理系学生日記

おまえはいつまで学生気分なのか

The Go Programming Language

The Go Programming Language を読みました。

Golang が流行ってきていたので、じゃぁ買って理解するかーと思って購入したそのすぐ後で日本語訳が出版されたので、なかなか辛いものがある。

内容

本としては、おおよその言語仕様を詳説しているという内容でした。

  • データ型
  • 関数
  • メソッド
  • Goroutine
  • Channel
  • 並行プログラミング
  • リフレクション

このため、標準パッケージそのものに焦点を当てた記述は特になかったように思われるのですが、それでも様々な箇所のサンプルコードで標準パッケージが使われており、それに対する言及も行われていて、全体として基本的なパッケージの使い方も分かるようになっています。 その意味では、K&R のプログラミング言語 C の位置づけだと思うと分かりやすいかもしれません。

プログラミング言語としての Go

C 言語のアップグレード版とも称される Go ですが、確かに C よりはずっと書きやすいだろうなぁという印象でした。 構造体やポインタがある点は共通ですが、ポインタの値を直接演算することはできません。また、言語として Map を持っているというのが扱いやすさとして大きく違うと思います。 何より、標準ライブラリの数が全く違う (その意味では、C や C++ が少ないというのはありそうですが) ので、何か困ったときであっても大概の処理は標準ライブラリに任せれば良いなぁという安心感があります。

それでも、言語としての最も大きなメリットは、クロスコンパイルだと思います。 Windows 環境で開発して実運用は Linux、とか、MacOS で開発して動かすのは Windows とか、そういうことが多い状況なので、1 ソースで、様々な環境に適応できるのは嬉しいなぁと。 これからも学んでいきたいと思います。

go 1.8 でのサポート環境は以下のとおり。

$ gox -osarch-list
Supported OS/Arch combinations for go1.8 are shown below. The "default"
boolean means that if you don't specify an OS/Arch, it will be
included by default. If it isn't a default OS/Arch, you must explicitly
specify that OS/Arch combo for Gox to use it.

darwin/386      (default: true)
darwin/amd64    (default: true)
linux/386       (default: true)
linux/amd64     (default: true)
linux/arm       (default: true)
freebsd/386     (default: true)
freebsd/amd64   (default: true)
openbsd/386     (default: true)
openbsd/amd64   (default: true)
windows/386     (default: true)
windows/amd64   (default: true)
freebsd/arm     (default: true)
netbsd/386      (default: true)
netbsd/amd64    (default: true)
netbsd/arm      (default: true)
plan9/386       (default: false)
dragonfly/386   (default: false)
dragonfly/amd64 (default: false)
nacl/amd64      (default: false)
nacl/amd64p32   (default: false)
nacl/arm        (default: false)
solaris/amd64   (default: false)
android/arm     (default: false)
plan9/amd64     (default: false)
darwin/arm      (default: false)
darwin/arm64    (default: false)
linux/arm64     (default: false)
linux/ppc64     (default: false)
linux/ppc64le   (default: false)